Próbuję dowiedzieć się więcej o referencje rvalue ale utknąłem na tym najprostszym przykładzie:RValue hello world brakuje 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;
}
Mam skompilowany z Clang 3.2 i -std=c++11 -fno-elide-constructors
(w celu uniknięcia (N) RVO), ale wynik jest zaskakujący do mnie:
C()
~C() // huh?
C(C&&)
~C()
~C()
spodziewałem się dokładnie, że z wyjątkiem pierwszego ~C()
. Skąd się wziął i czego mi brakuje, ponieważ są 2 konstrukcje i 3 zniszczenia? Czy wywoływany jest konstruktor & & ze zniszczoną referencją obiektu?
Krok przez nią w debugera i zobaczyć, gdzie rozmowy pochodzą. Masz rację, że liczba wywołań konstruktora i liczba wywołań destruktora powinny być takie same. –
Mam to http://liveworkspace.org/code/IlzNk$0 co jest oczekiwane –
@SethCarnegie: ale wybrałeś GCC 4.7.2, prawda? Próbowałem wybrać klang 3.2 i otrzymałem wynik pokazany przez OP –