#include <iostream>
struct A
{
int val;
A(int val) : val(val) { std::cout << "A(int) val = " << val << '\n'; }
A(const A& other) : val(other.val) { std::cout << "A(const A&) val = " << val << '\n'; }
A(A&& other) : val(other.val) { other.val = 0; std::cout << "A(A&&) val = " << val << '\n'; }
~A() { std::cout << "~A() val = " << val << '\n'; }
A& operator = (const A& rhs) { val = rhs.val; std::cout << "A& operator = (const A&) val = " << val << '\n'; return *this; }
A& operator = (A&& rhs) { val = rhs.val; rhs.val = 0; std::cout << "A& operator = (A&&) val = " << val << '\n'; return *this; }
};
A foo()
{
A a(77);
return a;
}
A bar()
{
A a(777);
return std::move(a);
}
int main()
{
{
std::cout << "foo:\n";
A a = foo();
}
{
std::cout << "bar:\n";
A v = bar();
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnN0cnVjdCBBCnsKCWludCB2YWw7CiAKCUEoaW50IHZhbCkgOiB2YWwodmFsKSB7IHN0ZDo6Y291dCA8PCAiQShpbnQpIHZhbCA9ICIgPDwgdmFsIDw8ICdcbic7IH0KIAoJQShjb25zdCBBJiBvdGhlcikgOiB2YWwob3RoZXIudmFsKSB7IHN0ZDo6Y291dCA8PCAiQShjb25zdCBBJikgdmFsID0gIiA8PCB2YWwgPDwgJ1xuJzsgfQoJQShBJiYgb3RoZXIpIDogdmFsKG90aGVyLnZhbCkgeyBvdGhlci52YWwgPSAwOyBzdGQ6OmNvdXQgPDwgIkEoQSYmKSB2YWwgPSAiIDw8IHZhbCA8PCAnXG4nOyB9CiAKCX5BKCkgeyBzdGQ6OmNvdXQgPDwgIn5BKCkgdmFsID0gIiA8PCB2YWwgPDwgJ1xuJzsgfQogCglBJiBvcGVyYXRvciA9IChjb25zdCBBJiByaHMpIHsgdmFsID0gcmhzLnZhbDsgc3RkOjpjb3V0IDw8ICJBJiBvcGVyYXRvciA9IChjb25zdCBBJikgdmFsID0gIiA8PCB2YWwgPDwgJ1xuJzsgcmV0dXJuICp0aGlzOyB9CglBJiBvcGVyYXRvciA9IChBJiYgcmhzKSB7IHZhbCA9IHJocy52YWw7IHJocy52YWwgPSAwOyBzdGQ6OmNvdXQgPDwgIkEmIG9wZXJhdG9yID0gKEEmJikgdmFsID0gIiA8PCB2YWwgPDwgJ1xuJzsgcmV0dXJuICp0aGlzOyB9Cn07CiAKQSBmb28oKQp7CglBIGEoNzcpOwoJcmV0dXJuIGE7Cn0KIApBIGJhcigpCnsKCUEgYSg3NzcpOwoJcmV0dXJuIHN0ZDo6bW92ZShhKTsKfQogCmludCBtYWluKCkKewoJewoJCXN0ZDo6Y291dCA8PCAiZm9vOlxuIjsKCQlBIGEgPSBmb28oKTsKCX0KCXsKCQlzdGQ6OmNvdXQgPDwgImJhcjpcbiI7CgkJQSB2ID0gYmFyKCk7Cgl9Cn0=