2016-07-07 24 views
6

Meines Wissens wird der Move-Konstruktor aufgerufen, wenn ein temporäres Objekt erstellt wird. Hier ist die getA() Funktion zurückkehrt ein temporäres Objekt, aber mein Programm nicht druckt die Nachricht aus dem Zug Konstruktor:Warum wird der Move-Konstruktor nicht aufgerufen?

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 
    A() 
    { 
     cout<<"Hi from default\n"; 
    } 

    A(A && obj) 
    { 
     cout<<"Hi from move\n"; 
    } 
}; 

A getA() 
{ 
    A obj; 
    cout<<"from getA\n"; 
    return obj; 
} 

int main() 
{ 
    A b(getA()); 

    return 0; 
} 
+0

Ich suchte mit move constructor und google führt mich nicht zu dieser Seite –

Antwort

6

Der Compiler erlaubt die Instanz obj zu optimieren und ohne eine für den Anrufer direkt wieder das Objekt senden konzeptionelle Wertkopie wird genommen.

Dies wird genannt Rückgabewert-Optimierung (NRVO) genannt. Es ist eine aggressivere Optimierung als die Rückgabewertoptimierung (RVO), die ein Compiler aufrufen kann, um die Wertkopie eines anonymen Temporären zu umgehen.

Zur Vermeidung von Zweifeln der Compiler kann dies tun, auch wenn gibt es einen Nebeneffekt dabei (in Ihrem Fall der Mangel an Konsolenausgabe).

+0

Was war falsch mit dem Ziel dupieren? – NathanOliver

+0

Es war mehr mit RVO nicht (die neuere) NRVO zu tun. IMHO ein Duplikat ist nur ein gutes, wenn es ziemlich genau ist. – Bathsheba

+0

Die Hälfte der Antworten sprach über und Beispiel NRVO. – NathanOliver

Verwandte Themen