Program wird in 3 großen C ++ - Compilern unterschiedlich kompiliert. Welcher ist richtig

Als interessantes Follow-up (allerdings nicht von großer praktischer Bedeutung) zu meiner vorherigen Frage:Warum erlaubt uns C ++, den Variablennamen beim Deklarieren einer Variablen in Klammern zu setzen?

Ich fand heraus, dass die Deklaration in Klammern mit @ kombinieinjected class name -Funktion kann zu überraschenden Ergebnissen hinsichtlich des Compilerverhaltens führen.

Schauen Sie sich folgendes Programm an:

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

eim Kompilieren mit g ++ 4.9.2 erhalte ich den folgenden Kompilierungsfehler:

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

Es wird erfolgreich mit MSVC2013 / 2015 kompiliert und drucktC (B *)

Es kompiliert erfolgreich mit Clang 3.5 und drucktC

So obligatorische Frage ist welche ist richtig? :)

(Ich schwankte stark in Richtung Clang-Version, und msvc-Methode, um die Deklaration von Variablen zu beenden, nachdem ich nur den Typ technisch geändert habe, scheint seine typedef irgendwie seltsam)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage