#include <iostream>
#include <utility>
struct X
{
X() = default;
X(X const &) { std::cout << "Copy X\n"; }
X(X &&) { std::cout << "Move X\n"; }
};
struct Foo
{
X * p;
template <typename T> Foo(T t) : p(new T(std::move(t))) { }
};
int main()
{
X x;
Foo a { X() };
Foo b { x };
Foo c { std::move(x) };
//Foo d(10); // Error
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KCnN0cnVjdCBYCnsKICBYKCkgPSBkZWZhdWx0OwogIFgoWCBjb25zdCAmKSB7IHN0ZDo6Y291dCA8PCAiQ29weSBYXG4iOyB9CiAgWChYICYmKSB7IHN0ZDo6Y291dCA8PCAiTW92ZSBYXG4iOyB9Cn07CgpzdHJ1Y3QgRm9vCnsKICBYICogcDsKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRm9vKFQgdCkgOiBwKG5ldyBUKHN0ZDo6bW92ZSh0KSkpIHsgfQp9OwoKaW50IG1haW4oKQp7CiAgWCB4OwogIEZvbyBhIHsgWCgpIH07CiAgRm9vIGIgeyB4IH07CiAgRm9vIGMgeyBzdGQ6Om1vdmUoeCkgfTsKICAvL0ZvbyBkKDEwKTsgLy8gRXJyb3IKfQo=