2010-11-26 4 views
9
struct my 
{ 
    my(){ std::cout<<"Default";} 
    my(const my& m){ std::cout<<"Copy";} 
    ~my(){ std::cout<<"Destructor";} 
}; 

int main() 
{ 
    my m(); //1 
    my n(my()); //2 
} 

Erwartete Ausgabe:Konstruktor Aufrufmechanismus

1) Default 
2) Copy 

tatsächlicher Ausgang:


Was mit meinem Verständnis des Konstruktor rufenden Mechanismus falsch?

Note Ich habe Header-Dateien aus Gründen der Kürze weggelassen.

Antwort

11

Kasten 1)

m als Funktion return my und nehmen keine Argumente interpretiert. Um zu sehen, die erwartete Ausgabe entfernen () d.h verwenden my m;

Fall 2)

Das ist etwas besser als die „drängendsten Parsen“ bekannt.

n wird als eine Funktion interpretiert, die my zurückgibt, die ein Argument vom Typ Zeiger an die Funktion my zurücknimmt, die keine Argumente nimmt.

Um die erwartete Ausgabe in diesem Fall versuchen my n((my())); [Statt der Behandlung als Argument Spezifikation wie im ersten Fall würde der Compiler nun als Ausdruck interpretiert wegen der zusätzlichen ()] siehe

Meiner Interpretation:

my n((my())) entspricht my n = my(). Nun ist die rvalue Ausdruck my() schafft eine temporäre [dh einen Aufruf der Standard-Konstruktor] und n wird Kopie an diesem temporären Objekt initialisiert [ohne Aufruf der Kopie-Ctor wegen einiger compiler optimization]

PS: Ich bin nicht 100% sicher über den letzten Teil meiner Antwort. Korrigiere mich, wenn ich falsch liege.

+1

Es heißt nicht RVO, aber es ist in der Tat eine allgemeine Optimierung. – MSalters

+3

@MSalters: Ja, ich denke, das ist eine Variante von RVO. :) –

1

Wie Prasoon vermute ich, dass der C++ - Compiler Ihren Code in einer Weise parst, die Sie nicht erwarten. Zum Beispiel, ich glaube, es die Linie

my m(); 

als Funktion Prototyp Erklärung, nicht als Variablendeklaration und rufen Sie an den Konstruktor wird das Parsen - also warum Sie keine Ausgabe sehen.

Verwandte Themen