67

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

我相信我将能够按照提案 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;
};
4

1 回答 1

4

好问题。我最近尝试编写类似的代理类,但从未获得好的解决方案。我发现的最好的方法是在每次需要代理为 r 值的情况下调用成员函数:

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

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

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

于 2013-03-04T10:05:25.103 回答