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