Programa sendo compilado de maneira diferente em três principais compiladores C ++. Qual é o certo?

Como um acompanhamento interessante (embora não seja de grande importância prática) à minha pergunta anterior:Por que o C ++ nos permite colocar o nome da variável entre parênteses ao declarar uma variável?

Descobri que combinar a declaração entre parênteses comnome da classe injetada Esse recurso pode levar a resultados surpreendentes em relação ao comportamento do compilador.

Dê uma olhada no seguinte programa:

#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);
}

Compilar com o g ++ 4.9.2 me dá o seguinte erro de compilação:

main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]

Compila com sucesso com o MSVC2013 / 2015 e imprimeC (B *)

Compila com sucesso com o clang 3.5 e imprimeC

Então pergunta obrigatória é qual é o certo? :)

(Eu mudei fortemente para a versão clang e a maneira msvc de parar de declarar variável depois de mudar de tipo com tecnicamente seu typedef parece meio estranho)

questionAnswers(2)

yourAnswerToTheQuestion