#include <iostream>
#include <utility> //für std::move
#include <vector>
#include <cstdlib>
struct A
{
std::vector<int> n;
A(A&& a) { n.swap(a.n); std::cout<<"swaped"<<std::endl; }
A(const A& a) : n(a.n) { std::cout<<"kopiert"<<std::endl; }
A() {}
};
A f() //erstellt irgendein Objekt vom Typ A
{
A a, b;
a.n.push_back(rand());
b.n.push_back(rand());
return a.n.back() > 77 ? a : b;
}
int main()
{
A b,c;
A a1(b); //Erwartet: normaler Konstruktor. Passt.
A a2(std::move(c)); //Erwartet: Rvalue Construktor: Passt
A a3(f()); //Erwartet: Rvalue Konstruktor. Passt nicht.
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAKI2luY2x1ZGUgPHV0aWxpdHk+IC8vZsO8ciBzdGQ6Om1vdmUgCiNpbmNsdWRlIDx2ZWN0b3I+IAojaW5jbHVkZSA8Y3N0ZGxpYj4gCnN0cnVjdCBBIAp7IAogICAgc3RkOjp2ZWN0b3I8aW50PiBuOyAKICAKICAgIEEoQSYmIGEpICB7ICBuLnN3YXAoYS5uKTsgc3RkOjpjb3V0PDwic3dhcGVkIjw8c3RkOjplbmRsOyB9IAogICAgQShjb25zdCBBJiAgYSkgOiBuKGEubikgeyBzdGQ6OmNvdXQ8PCJrb3BpZXJ0Ijw8c3RkOjplbmRsOyB9IAogICAgQSgpIHt9IAp9OyAKICAKQSBmKCkgLy9lcnN0ZWxsdCBpcmdlbmRlaW4gT2JqZWt0IHZvbSBUeXAgQSAKeyAKICAgIEEgYSwgYjsgCiAgICBhLm4ucHVzaF9iYWNrKHJhbmQoKSk7IAogICAgYi5uLnB1c2hfYmFjayhyYW5kKCkpOwogICAgcmV0dXJuIGEubi5iYWNrKCkgPiA3NyA/IGEgOiBiOyAKfSAKICAKaW50IG1haW4oKSAKeyAKICAgIEEgYixjOyAKICAKICAgIEEgYTEoYik7IC8vRXJ3YXJ0ZXQ6IG5vcm1hbGVyIEtvbnN0cnVrdG9yLiBQYXNzdC4gCiAgICBBIGEyKHN0ZDo6bW92ZShjKSk7IC8vRXJ3YXJ0ZXQ6IFJ2YWx1ZSBDb25zdHJ1a3RvcjogUGFzc3QgCiAgICBBIGEzKGYoKSk7IC8vRXJ3YXJ0ZXQ6IFJ2YWx1ZSBLb25zdHJ1a3Rvci4gUGFzc3QgbmljaHQuIAp9