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;
}