С++ - что это делает, если конструктор является закрытым?

В коде ниже, почему компилятор не жалуется на mClass2?

class CMyClass{
private:
    CMyClass(){}
};

void TestMethod(){
    CMyClass mClass1;   //Fails.
    CMyClass mClass2(); //Works.
}

Ответы

Ответ 1

Потому что вы только что объявили функцию mClass2 нулевых аргументов, которая возвращает a CMyClass. Это допустимый вариант, поскольку может быть, скажем, экземпляр static CMyClass, к которому эта функция имеет доступ. Обратите внимание, что CMyClass все еще имеет открытый конструктор копии.

(Чтобы убедить себя, скомпилируйте этот модуль для ассемблера и обратите внимание, что комментирование строки CMyClass mClass2(); приводит к тому же выводу.)

Ответ 2

Потому что он объявляет функцию и не вызывает конструктор, как вы думаете.

Это называется Самый Vexing Parse в С++.

CMyClass mClass2(); 

объявляет функцию mClass2(), которая не принимает параметр и возвращает CMyClass

Ответ 3

Второй - это объявление функции.

Ответ 4

Люди должны перейти к равномерной синтаксической инициализации в С++ 0x/С++ 11, используя вместо этого {} скобки, что устраняет эту проблему.

Класс C {};

http://www2.research.att.com/~bs/C++0xFAQ.html#uniform-init