Das hier Problem ist, dass der Compiler
test(_b);
nicht als Code interpretiert, die _b
, ein temporäres Objekt vom Typ erzeugt in Parameter test
geben, sondern als variable Deklaration für ein variable _b
vom Typ namens test
, mit der Standardkonstruktor. Folglich sieht das wie ein Stück Code, das ein temporäres test
Objekt unter Verwendung des zweiten Konstruktor erzeugt wird stattdessen rekursiv ein neues Objekt des Typs test
und Aufrufe den Konstruktor ein anderes Mal zu schaffen.
Um dies zu beheben, können Sie die Variable einen expliziten Namen geben, wie
test t(_b);
Dies kann als eine Variable vom Typ nur test
t
, mit dem Namen interpretiert werden initialisiert, um den zweiten Konstruktor.
Ich habe nie vorher gesehen, und ich habe seit Jahren in C++ wurde Programmierung. Danke, dass Sie mir noch ein Eckfall der Sprache gezeigt haben!
Für eine offizielle Erklärung: Gemäß der C++ 03 ISO-Spezifikation, § 6.8:
Es gibt eine Mehrdeutigkeit in der Grammatik Einbeziehung Ausdruck-Aussagen und Erklärungen: Eine Ausdruck-Anweisung mit einer Funktion im Stil explizite Typumwandlung (5.2.3) als äußerste linke subexpression aus einer Erklärung nicht zu unterscheiden sein kann, wo der erste declarator beginnt mit einem (. In diesen Fällen sind die Erklärung eine Erklärung.
(Hervorhebung von mir). mit anderen Worten, jedes Mal, C++ entweder als einen Ausdruck, der eine Aussage interpretieren könnte (die temporäre Objekt Besetzung) oder als Deklaration (einer Variablen), wählt sie die Deklaration aus, die C++ - Spezifikation gibt explizit
T (a);
Als Beispiel für eine Erklärung, nicht eine Besetzung von a
etwas vom Typ T
.
Dies ist C++ Most Vexing Parse - was aussieht wie ein Ausdruck wird stattdessen als Deklaration interpretiert. Ich habe den MVP schon einmal gesehen, aber ich habe ihn nie in diesem Zusammenhang gesehen.
Hoffe, das hilft!
Es ist Rekursion wegen 'test (_b);' aber ich bin mir nicht sicher warum genau. – Roddy
@ Roddy- Ich habe es gerade herausgefunden; Siehe meine Antwort für Details. – templatetypedef
Gereinigte Version mit unwichtigen Zeug entfernt: http://ideone.com/z0yc7Q – Yakk