El programa se compila de manera diferente en 3 compiladores principales de C ++. ¿Cuál es la correcta?

Como un seguimiento interesante (aunque no de gran importancia práctica) a mi pregunta anterior:¿Por qué C ++ nos permite rodear el nombre de la variable entre paréntesis al declarar una variable?

Descubrí que combinar la declaración entre paréntesis connombre de clase inyectado La característica puede conducir a resultados sorprendentes con respecto al comportamiento del compilador.

Echa un vistazo al siguiente 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 con g ++ 4.9.2 me da el siguiente error de compilación:

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

Se compila correctamente con MSVC2013 / 2015 e imprimeC (B *)

Se compila con éxito con clang 3.5 e imprimeC

Entonces, la pregunta obligatoria es ¿cuál es la correcta? :)

(Sin embargo, me incliné fuertemente hacia la versión clang y la forma msvc de dejar de declarar variables después de solo cambiar el tipo con técnicamente su typedef parece un poco extraño)

Respuestas a la pregunta(2)

Su respuesta a la pregunta