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)