#include <vector>
#include <utility>
template <typename T>
class r_value_ref
{
public:
explicit r_value_ref(const T& t) : t(t) {}
T& get() const
{
return const_cast<T&>(t);
}
operator T&() const
{
return const_cast<T&>(t);
}
private:
const T& t;
};
template <typename T>
r_value_ref<T> my_move(const T& t)
{
return r_value_ref<T>(t);
}
class Foo
{
public:
Foo(r_value_ref<std::vector<int> > vec)
{
m_vec.swap(vec); // no .get() required !
// or std::swap(vec.get(), m_vec);
}
private:
std::vector<int> m_vec;
};
int main()
{
Foo foo_from_r_value(my_move(std::vector<int>(100, 1337)));
std::vector<int> v2(100, 1337);
Foo foo_from_l_value(my_move(v2));
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHV0aWxpdHk+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3Mgcl92YWx1ZV9yZWYKewpwdWJsaWM6CiAgICBleHBsaWNpdCByX3ZhbHVlX3JlZihjb25zdCBUJiB0KSA6IHQodCkge30KCiAgICBUJiBnZXQoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBjb25zdF9jYXN0PFQmPih0KTsKICAgIH0KICAgIAogICAgb3BlcmF0b3IgVCYoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBjb25zdF9jYXN0PFQmPih0KTsKICAgIH0KCnByaXZhdGU6ICAgIAogICAgY29uc3QgVCYgdDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpyX3ZhbHVlX3JlZjxUPiBteV9tb3ZlKGNvbnN0IFQmIHQpCnsKICAgIHJldHVybiByX3ZhbHVlX3JlZjxUPih0KTsKfQoKY2xhc3MgRm9vCnsKcHVibGljOgogICAgRm9vKHJfdmFsdWVfcmVmPHN0ZDo6dmVjdG9yPGludD4gPiB2ZWMpCiAgICB7CiAgICAgICAgbV92ZWMuc3dhcCh2ZWMpOyAvLyBubyAuZ2V0KCkgcmVxdWlyZWQgIQogICAgICAgIC8vIG9yIHN0ZDo6c3dhcCh2ZWMuZ2V0KCksIG1fdmVjKTsKICAgIH0KCnByaXZhdGU6CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IG1fdmVjOwp9OwoKaW50IG1haW4oKQp7CiAgICBGb28gZm9vX2Zyb21fcl92YWx1ZShteV9tb3ZlKHN0ZDo6dmVjdG9yPGludD4oMTAwLCAxMzM3KSkpOwoKICAgIHN0ZDo6dmVjdG9yPGludD4gdjIoMTAwLCAxMzM3KTsKICAgIEZvbyBmb29fZnJvbV9sX3ZhbHVlKG15X21vdmUodjIpKTsKfQo=