#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());
if (a.n.back() > 77)
return a;
return 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+IAojaW5jbHVkZSA8Y3N0ZGxpYj4gCnN0cnVjdCBBIAp7IAogICAgc3RkOjp2ZWN0b3I8aW50PiBuOyAKICAKICAgIEEoQSYmIGEpICB7ICBuLnN3YXAoYS5uKTsgc3RkOjpjb3V0PDwic3dhcGVkIjw8c3RkOjplbmRsOyB9IAogICAgQShjb25zdCBBJiAgYSkgOiBuKGEubikgeyBzdGQ6OmNvdXQ8PCJrb3BpZXJ0Ijw8c3RkOjplbmRsOyB9IAogICAgQSgpIHt9IAp9OyAKICAKQSBmKCkgLy9lcnN0ZWxsdCBpcmdlbmRlaW4gT2JqZWt0IHZvbSBUeXAgQSAKeyAKICAgIEEgYSwgYjsgCiAgICBhLm4ucHVzaF9iYWNrKHJhbmQoKSk7IAogICAgYi5uLnB1c2hfYmFjayhyYW5kKCkpOwogICAgaWYgKGEubi5iYWNrKCkgPiA3NykKICAgICAgICByZXR1cm4gYTsKICAgIHJldHVybiBiOwp9IAogIAppbnQgbWFpbigpIAp7IAogICAgQSBiLGM7IAogIAogICAgQSBhMShiKTsgLy9FcndhcnRldDogbm9ybWFsZXIgS29uc3RydWt0b3IuIFBhc3N0LiAKICAgIEEgYTIoc3RkOjptb3ZlKGMpKTsgLy9FcndhcnRldDogUnZhbHVlIENvbnN0cnVrdG9yOiBQYXNzdCAKICAgIEEgYTMoZigpKTsgLy9FcndhcnRldDogUnZhbHVlIEtvbnN0cnVrdG9yLiBQYXNzdCBuaWNodC4gCn0=