#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());
    }
