没有'右值引用*this'功能的变通方法

boy*_*ycy 67 c++ rvalue-reference move-semantics c++11

我有一个围绕可移动对象的代理容器类,并希望代理能够隐式地产生对底层对象的rvalue引用,但仅在代理本身被移动时.

我相信我将能够按照提议n2439 "将移动语义扩展到*this"来实现此行为,但它尚未在gcc的发行版中提供,并且暂时不会出现.

下面的代码是我最终的目标,但目前无法实现.在此功能可用之前,是否有任何等效的解决方法?

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

    operator const T&() const& {
        return value;
    }

private:
    T value;
};
Run Code Online (Sandbox Code Playgroud)

dha*_*rdy 4

好问题。我最近尝试编写类似的代理类,但从未实现良好的解决方案。我发现最好的方法是在每次使用时调用成员函数,其中代理需要是右值:

ORef<T> move() {
    return ORef<T>( this->release() );
}
Run Code Online (Sandbox Code Playgroud)

这改变了将某些东西声明为右值的语义,从std::move(proxy)to proxy.move(),但也允许返回不同类型的对象(隐式转换为您所需的类型)。

我使用它的编码实践是始终将代理对象作为右值传递,这强制手动指定语义(移动、共享引用、复制或其他),但这当然会使使用错误成为潜在的问题(例如,在x.move()最终使用之前调用x) 。