Почему в приведенном ниже коде компилятор не жалуется на mClass2?
class CMyClass{
private:
CMyClass(){}
};
void TestMethod(){
CMyClass mClass1; //Fails.
CMyClass mClass2(); //Works.
}
Почему в приведенном ниже коде компилятор не жалуется на mClass2?
class CMyClass{
private:
CMyClass(){}
};
void TestMethod(){
CMyClass mClass1; //Fails.
CMyClass mClass2(); //Works.
}
Поскольку вы только что объявили функцию mClass2
с нулевыми аргументами, которая возвращает CMyClass
. Это допустимый вариант, поскольку может существовать, скажем, экземпляр static CMyClass
, к которому эта функция имеет доступ. Обратите внимание, что CMyClass
по-прежнему имеет общедоступный конструктор копии.
(Чтобы убедиться в этом, скомпилируйте этот модуль на ассемблере и обратите внимание, что закомментирование строки CMyClass mClass2();
приводит к тому же результату.)
Потому что это объявление функции, а не вызов конструктора, как вы думаете.
Это называется самым неприятным разбором на С++.
CMyClass mClass2();
объявляет функцию mClass2()
, которая не принимает параметров и возвращает CMyClass
Второй — это объявление функции.
Людям следует перейти к инициализации единого синтаксиса в C++0x/C++11, используя вместо этого скобки {}, что устраняет эту проблему.
Класс С{};
http://www2.research.att.com/~bs/C++0xFAQ.html#uniform-init