2016-11-23 1 views
0

In C++ 14.11 haben wir: Rückgabewert-Optimierung, Semantik bewegen, einige Klassen wie unique_ptr die über keine Kopie CtorC++ 11. Verschieben Semantik für lvalue Referenz in return-Anweisung

Q1: Was ist ein korrektes Verhalten von das Code-Snippet unten, wenn DECLARE_COPY_CTOR gleich 1 oder zu Null ist?

Q2: Konsolenanwendung gebaut mit MSVC 2013 für Code-Schnipsel unten in DEBUG Build für Win32 gibt in der Konsole: A(), A (A & &), ~ A(), ~ A(). Es sieht also aus wie lvalue referencce "a" wurde verwendet, um an "A & &" zu binden. Ist es legal? Ich dachte, dass nur temporäre Objekte ein Kandidat für den Umzug sein können.

Q3: In Release-Build-Compiler wählen Rvo verwenden (so ausgegeben wurde: A(), ~ A())

Compiler frei zu wählen, ist "a" in Funktionsumfang ein Canditate für Bewegung ist?

#include <stdio.h> 
#include <iostream> 
#include <memory> 

#define DECLARE_COPY_CTOR 0 

class A 
{ 
public: 
    A() {puts("A()");} 
    ~A() { puts("~A()"); } 

#if DECLARE_COPY_CTOR 
    A(A&) { puts("A(A&)"); } 
#endif 

    A(A&&) { puts("A(A&&)"); } 
    A& operator = (A&) { puts("A& operator = (A&)"); return *this; } 
}; 

A F() 
{ 
    A a;  // here a is lvalue 
    return a; // here a is still lvalue 
} 

int main() 
{ 
    auto i = F(); 
    return 0; 
} 

Antwort

2

Q1. Was ist ein korrektes Verhalten des Codeausschnitts, wenn DECLARE_COPY_CTOR gleich 1 oder null ist?

DECLARE_COPY_CTOR hat keine Auswirkungen auf das Verhalten. Der Kopierkonstruktor wird im Programm nicht aufgerufen.

Q2. So sieht aus wie lvalue referencce "a"

a ist ein L-Wert, aber es ist kein L-Wert Referenz.

Q2. Ist es legal?

Ja, ist es legal, einen nicht-kopierbaren lokalen lvalue zurückzukehren. Es wird verschoben werden.

Q3. Ist Compiler frei zu wählen ist "a" im Funktionsumfang ist ein Kandidat für den Umzug?

Wenn die Art der zurück lokale Variable beweglich ist, dann ist es muss anstatt kopiert verschoben werden. NRVO bezieht sich auf diesen Fall, so dass der Compiler frei ist, den Zug zu verlassen - genauso wie es ihm freisteht, die Kopie vor C++ 11 zu entziffern.

Verwandte Themen