Як цікаве спостереження (хоча це не має великого практичного значення) до мого попереднього запитання: Чому C ++ дозволяє нам оточувати ім'я змінної в дужках при оголошенні змінної?
Я з’ясував, що поєднання декларації в круглих дужках із введеною функцією імені класу може призвести до дивовижних результатів щодо поведінки компілятора.
Погляньте на наступну програму:
#include <iostream>
struct B
{
};
struct C
{
C (){ std::cout << "C" << '\n'; }
C (B *) { std::cout << "C (B *)" << '\n';}
};
B *y = nullptr;
int main()
{
C::C (y);
}
Компіляція з g ++ 4.9.2 дає мені таку помилку компіляції:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
Він успішно збирається з MSVC2013 / 2015 та друкує
C (B *)
Він успішно компілюється із затискачем 3.5 та відбитками
C
Тож обов’язкове запитання, яке з них правильне? :)
(Я сильно хитнувся до версії кланг, хоча і msvc спосіб зупинити оголошення змінної після просто зміни типу технічно його typedef здається дивним)
C::C
не називає тип, він називає функцію, тому GCC є правильним imo.
C::C y;
не має сенсу, правда? Також НЕC::C (y);
Спочатку я подумав , що це екземпляр Most-прикрий-Аналізувати stackoverflow.com/questions/tagged/most-vexing-parse , але тепер я думаю , що це просто невизначений поведінка означає все три компіляторів «правильно.»