Als interessante Folge (allerdings nicht von großer praktischer Bedeutung) zu meiner vorherigen Frage: Warum erlaubt C ++ uns, den Variablennamen beim Deklarieren einer Variablen in Klammern zu setzen?
Ich fand heraus, dass das Kombinieren der Deklaration in Klammern mit der Funktion für injizierte Klassennamen zu überraschenden Ergebnissen hinsichtlich des Compilerverhaltens führen kann.
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);
}
Das Kompilieren mit g ++ 4.9.2 führt zu folgendem Kompilierungsfehler:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
Es wird erfolgreich mit MSVC2013 / 2015 kompiliert und gedruckt
C (B *)
Es wird erfolgreich mit clang 3.5 kompiliert und gedruckt
C
Die obligatorische Frage ist also, welche richtig ist. :) :)
(Ich schwankte jedoch stark in Richtung Clang-Version und msvc Weg, um die Deklaration von Variablen zu stoppen, nachdem ich nur den Typ mit technisch geändert habe, scheint sein Typedef irgendwie seltsam)
C::C
benennt keinen Typ, sondern eine Funktion, daher ist GCC imo richtig.
C::C y;
macht keinen Sinn, oder? Auch nichtC::C (y);
Zuerst dachte ich , das war eine Instanz von Most-Vexing-Parse stackoverflow.com/questions/tagged/most-vexing-parse , aber jetzt denke ich , es ist nur nicht definiertes Verhalten bedeutet , alle drei Compiler sind „richtig.“