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

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

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

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

person R4D4    schedule 21.07.2011    source источник
comment
связанные stackoverflow.com/questions/4296090/   -  person Mihran Hovsepyan    schedule 21.07.2011
comment
Также известен как: Самый раздражающий анализ (см. en.wikipedia.org/wiki/Most_vexing_parse)   -  person Matthieu M.    schedule 21.07.2011


Ответы (4)


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

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

person Fred Foo    schedule 21.07.2011
comment
Кроме того, допустимый конструктор перемещения. - person Arafangion; 21.07.2011

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

Это называется самым неприятным разбором на С++.

CMyClass mClass2(); 

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

person Alok Save    schedule 21.07.2011
comment
Самый неприятный анализ - не могу сказать, что когда-либо слышал об этом раньше, я посмотрю на это, спасибо. :) - person R4D4; 21.07.2011

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

person Karoly Horvath    schedule 21.07.2011

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

Класс С{};

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

person David    schedule 21.07.2011