Ich versuche, mehr über rvalue Referenzen zu wissen, aber habe ich mich auf diesem einfachsten Beispiel stecken:rvalue Hallo Welt fehlt Konstruktor
#include <iostream>
using namespace std;
struct C {
C() { cout << "C()\n"; }
~C() { cout << "~C()\n"; }
C(const C&) { cout << "C(const C&)\n"; }
C& operator=(const C&) { cout << "operator=(const C&)\n"; return *this; }
C(C&&) { cout << "C(C&&)\n"; }
C& operator=(C&&) { cout << "operator=(C&&)\n"; return *this; }
};
C foo() { C c; return c; }
int main()
{
const C c = foo();
return 0;
}
Ich habe es mit Clang kompiliert 3.2 und -std=c++11 -fno-elide-constructors
(zur Vermeidung von (N) RVO), aber das Ergebnis ist für mich überraschend:
C()
~C() // huh?
C(C&&)
~C()
~C()
ich erwartet hatte genau, dass mit Ausnahme der ersten ~C()
. Woher kam es und was fehlt mir, weil es 2 Konstruktionen und 3 Zerstörungen gibt? Wird der & & Konstruktor mit einer zerstörten Objektreferenz aufgerufen ??
Schritt durch sie in einem Debugger und sehen, wo die Anrufe herkommen. Sie haben Recht, dass die Anzahl der Konstruktoraufrufe und die Anzahl der Destruktoraufrufe identisch sein sollten. –
Ich habe diese http://liveworkspace.org/code/IlzNk$0 bekommen was erwartet wird –
@SethCarnegie: aber Sie haben GCC 4.7.2 gewählt, nicht wahr? Ich habe versucht, clang 3.2 auszuwählen, und ich bekomme die Ausgabe, die durch das OP –