Программа компилируется по-разному в 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 кажется довольно странным)

Ответы на вопрос(2)

Ваш ответ на вопрос