struct X
{
X() { std::cout << "X()\n"; }
X(int) { std::cout << "X(int)\n"; }
};
const int answer = 42;
int main()
{
X(answer);
}
Ich hätte erwartet, dass dies auch gedruckt wird
X(int)
, weilX(answer);
als Besetzung vonint
bisX
oder interpretiert werden könnte- überhaupt nichts, weil
X(answer);
als Deklaration einer Variablen interpretiert werden könnte.
Es wird jedoch gedrucktX()
, und ich habe keine Ahnung, warum X(answer);
der Standardkonstruktor aufgerufen werden soll.
BONUSPUNKTE: Was müsste ich ändern, um eine temporäre anstelle einer variablen Deklaration zu erhalten?
c++
syntax
most-vexing-parse
Fredoverflow
quelle
quelle
X(int(answer));
druckt nichts, weil es eine Funktionsdeklaration ist :)double(expresso);
, los geht's, nur für dich deklariert;)Antworten:
Ihre Antwort ist hier versteckt. Wenn Sie eine Variable deklarieren, rufen Sie ihren Standard-Ctor auf (wenn kein POD und all das Zeug).
Bei Ihrer Bearbeitung: Um eine temporäre zu erhalten, haben Sie einige Optionen:
(X(answer));
(X)answer;
static_cast<X>(answer)
X{answer};
(C ++ 11)[]{ return X(answer); }();
(C ++ 11, möglicherweise Kopie)void(), X(answer);
X((void(),answer));
true ? X(answer) : X();
if(X(answer), false){}
for(;X(answer), false;);
X(+answer);
quelle
static_cast<X>(answer)
die "meiste C ++" - Antwort - es wird sogar von einer alten GCC-Dokumentation empfohlen , um einen Wert zu erzwingen.X(answer)
und garantiert einen CTOR-Anruf.X{answer}
.Die Klammern sind optional. Was Sie gesagt haben, ist identisch mit
X answer;
und es ist eine Erklärung.quelle
Wenn Sie eine Variable vom Typ X deklarieren möchten, gehen Sie folgendermaßen vor:
X y(answer);
quelle
X(int)
Ctor anrufen sollte .