Ich vermisse sicherlich etwas, aber ich verstehe nicht, warum dies kompiliert wird (sowohl mit g ++ als auch mit clang ++):
struct A
{
};
struct B
{
};
int main()
{
A a(B);
}
Zuallererst B
ist ein Typ ... kein Wert. Wie soll ich diesen Code interpretieren?
c++
syntax
declaration
most-vexing-parse
Picaud Vincent
quelle
quelle
A a(B());
Variablendefinition oder Funktionsdeklaration sein.struct A{}; int main() { A(foo); }
das so kompiliert wird , wie es ist , auch wenn Siefoo
nichts benennen.Antworten:
Es wird als Deklaration einer Funktion mit dem Namen interpretiert
a
, die ein Argument vom TypB
akzeptiert und zurückgibtA
.quelle
A a{B};
Es ist einfach eine Funktionsdeklaration, die erklärt
a
, dass es sich um eine Funktion handelt,A
die einen unbenannten Parameter vom Typ zurückgibt und verwendetB
.Dies ist gültig, da Funktionsdeklarationen im Gegensatz zu Funktionsdefinitionen in Funktionsdefinitionen zulässig sind.
quelle
Dieses Problem wird als die ärgerlichste Analyse bezeichnet . Die Zeile
A a(B);
kann als Deklaration einer Funktion mit dem Namen interpretiert werden, diea
ein Objekt vom TypA
zurückgibt und einen unbenannten Parameter vom Typ verwendetB
.Eine Möglichkeit, dieses Problem zu vermeiden, besteht darin, die in C ++ 11 eingeführte einheitliche Initialisierungssyntax zu verwenden, bei der Klammern anstelle von Klammern verwendet werden:
A a{B};
Gibt einen Fehler zurück. Die Zeile wird jetzt als Variablendeklaration interpretiert, die mit initialisiert wurdeB
, die ein Typ anstelle eines Werts ist.Hier finden Sie weitere Informationen:
Die ärgerlichste Analyse: Wie man sie erkennt und schnell behebt
quelle
struct A { };
sind in Standard C nicht gültig, selbst wenn einige Compiler dies zulassen. Lassen Sie die Zahnspange fallen und es würde dort kein Problem geben. In C wird durch Deklarieren oder Definierenstruct A
kein Typname erstelltA
(Sie müssen ihm ein Präfix voranstellenstruct
odertypedef struct A A;
irgendwo hinzufügen, bevorA
es ohne dasstruct
Präfix verwendet wird). Auch in C gibt es keine alternative Analyse zur Funktionsdeklaration - usingtype name(...);
kann einfach nie eine Variablendefinition sein; Es ist immer eine Funktionsdeklaration (oder ungültig). Der Code in der Frage ist nicht gültig in C.