没有“右值引用* this”特性的解决方法

我有一个围绕可移动对象的代理容器类,并希望代理能够隐式地产生对基础对象的右值引用,但只有当代理本身被移动时。

我相信我将能够按照提议n2439 “将移动语义扩展到* this”来实现此行为,但是它在gcc的发行版中还不可用,并且不会有一段时间。

下面的代码是我最终瞄准的,但目前不可能。 在此function可用之前,是否有任何等效的解决方法?

template< class T > struct movable_proxy { operator T&&() && { return std::move(value); } operator const T&() const& { return value; } private: T value; }; 

好问题。 我最近试图写类似的代理类,但从来没有取得好的解决scheme。 我发现最好的方式是在代理被要求为r值的每一次使用中调用成员函数:

 ORef<T> move() { return ORef<T>( this->release() ); } 

这改变了从std::move(proxy)proxy.move()声明一个r值的语义,但是也允许返回一个不同types的对象(隐式地转换为你所需的types)的可能性。

我的代码实践是总是通过代理对象作为rvalues强制手动指定语义(移动,共享引用,复制或其他),但这当然会使使用错误潜在的问题(例如调用x.move()之前x )的最终用法。