1

Ich habe im Wesentlichen die gleiche Frage wie this post, aber als ich ging, um die Top-Antwort zu testen, habe ich nicht die erwarteten Ergebnisse erhalten.Aufrufender Konstruktor in C++

Ich habe die folgende Klasse:

class Test 
{ 
public: 
    Test() 
    { 
     std::cout << "default constructor" << std::endl; 
    } 

    Test(const Test &other) 
    { 
     std::cout << "copy constructor" << std::endl; 
    } 

    Test& operator=(const Test &other) 
    { 
     std::cout << "assignment operator" << std::endl; 
     return *this; 
    } 

    ~Test() 
    { 
     std::cout << "destructor" << std::endl; 
    } 
}; 

nur sind die Konstrukteure zu verfolgen genannt. Ich habe dann den folgenden Code in der Haupt:

Test t1 = Test(); 

im verlinkten Beitrag auf die Antwort Basierend, würde ich vier Zeilen der Ausgabe erwarten: eine für Standard das temporäre Objekt, für das Kopieren der Konstruktion und zwei destructor Anrufe : eine für die Zerstörung der temporären und die andere für t1. Allerdings bekomme ich nur zwei Zeilen: "default constructor" und "destructor", vermutlich beide für t1 nach dem Beenden von main(). Könnte jemand im Detail erklären, was passiert? Kann jemand auch erklären, warum hier der Zuweisungsoperator verwendet wird? Sollte es nicht einen Lvalue erwarten (weil es einen Lvalue ref benötigt), während das temporäre Objekt ein Rvalue ist?

+3

http://en.cppreference.com/w/cpp/language/copy_elision C++ nicht Konstrukteuren hat zu rufen, wenn es nicht wirklich notwendig ist. – xaxxon

+2

Hunderte von Duplikaten. –

+0

'g ++-fno-elide-constructors' –

Antwort

3

C++ muss Konstruktoren nicht aufrufen, wenn dies nicht unbedingt erforderlich ist. In Ihrem Fall weiß es, dass das Objekt mit den Ergebnissen des Aufrufs auf der rechten Seite erstellt wird, sodass es die Zwischenschritte überspringt.

Sie können die erwarteten Ergebnisse sehen, indem Sie das Flag -fno-elide-constructors hinzufügen, aber das sollten Sie in der Praxis nie tun.

http://en.cppreference.com/w/cpp/language/copy_elision

es live sehen: http://melpon.org/wandbox/permlink/OoxFy1dV6LB3QDbH