#include <iostream>
template <class T>
struct rref {
rref (T& t) : t(t) {}
T& t;
};
template<class T>
rref<T> move(const T& t) {
return rref<T>(const_cast<T&>(t));
}
// you now can do a "move ctor"
struct Foo {
Foo() {}
Foo(rref<Foo>) { std::cout << "move ctor\n"; }
void operator=(rref<Foo>) { std::cout << "move assign\n"; }
Foo(const Foo&);
void operator=(const Foo&);
};
Foo make_foo()
{
Foo foo;
return foo;
}
int main() {
Foo foo = move(make_foo());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgc3RydWN0IHJyZWYgeyAKICAgICAgICBycmVmIChUJiB0KSA6IHQodCkge30KICAgICAgICBUJiB0OyAKICAgIH07CgogICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgIHJyZWY8VD4gbW92ZShjb25zdCBUJiB0KSB7CiAgICAgICByZXR1cm4gcnJlZjxUPihjb25zdF9jYXN0PFQmPih0KSk7CiAgICB9CgogICAgLy8geW91IG5vdyBjYW4gZG8gYSAibW92ZSBjdG9yIgogICAgc3RydWN0IEZvbyB7CiAgICAgICBGb28oKSB7fQogICAgICAgRm9vKHJyZWY8Rm9vPikgeyBzdGQ6OmNvdXQgPDwgIm1vdmUgY3RvclxuIjsgfQogICAgICAgdm9pZCBvcGVyYXRvcj0ocnJlZjxGb28+KSB7IHN0ZDo6Y291dCA8PCAibW92ZSBhc3NpZ25cbiI7IH0KICAgICAgIEZvbyhjb25zdCBGb28mKTsKICAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEZvbyYpOwogICAgfTsKCiAgICBGb28gbWFrZV9mb28oKQogICAgewogICAgICAgRm9vIGZvbzsKICAgICAgIHJldHVybiBmb287CiAgICB9CgogICAgaW50IG1haW4oKSB7CiAgICAgIEZvbyBmb28gPSBtb3ZlKG1ha2VfZm9vKCkpOwogICAgfQo=