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

时间:2013-01-28 13:22:41

标签: c++ c++11 move-semantics rvalue-reference

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

我相信我可以根据提案n2439 "Extending move semantics to *this"实现此行为,但它尚未在gcc版本中提供,并且暂时不会出现。

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

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

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

private:
    T value;
};

1 个答案:

答案 0 :(得分:4)

好问题。我最近尝试编写类似的代理类,但从未实现过一个好的解决方案。我发现最好的是在每个需要代理需要为r值的用途上调用成员函数:

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

这改变了将某个r值从std::move(proxy)声明为proxy.move()的语义,但也允许返回不同类型的对象(可隐式转换为所需类型)的可能性。 / p>

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