Программа компилируется по-разному в 3 основных компиляторах C ++. Какой из них прав?
В качестве интересного продолжения (хотя и не большого практического значения) моего предыдущего вопроса:Почему 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 *)
Он успешно компилируется с clang 3.5 и печатаетC
Итак, обязательный вопрос: какой из них прав? :)
(Я сильно склонился к версии clang, и msvc способ прекратить объявлять переменную после простого изменения типа технически, его typedef кажется довольно странным)