无法使用'rvalue references to *this'功能的解决方法

67
我有一个代理容器类封装了一个可移动对象,并希望代理能够在自身被移动时隐式返回基础对象的右值引用。
我相信我可以按照n2439提案"将移动语义扩展到*this"来实现此行为,但它在gcc的发布版本中尚不可用,而且可能要等一段时间。
下面的代码是我最终的目标,但目前还不可能。在此功能可用之前,是否有任何等效的解决方法?
template< class T >
struct movable_proxy {
    operator T&&() && {
        return std::move(value);
    }

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

private:
    T value;
};

9
我认为你能够得到的最接近结果是一个显式进行转换的函数,而不是使用转换操作符,因此你需要使用convert_proxy(p),这个函数会针对右值和左值进行重载,返回T&&或者const T&...但这样会使代理的使用变得不透明,这可能不是你想要的。 - Jonathan Wakely
5
我很好奇。抱歉我理解不够,但我想了解清楚。如果你删除了最新提出的 &&& 修饰符,你会失去什么? - Andy Prowl
5
记录一下,在 clang 2.9 中尝试一下 give it a go in - Lightness Races in Orbit
8
对于不了解的人,这是一个不要脸的推广:什么是“rvalue引用 *this”? - Xeo
14
@Omnifarious,只是因为它还没有被实现。这是最后一个缺失的核心语言特性,但相比于lambda表达式、右值引用等,需求(或者我认为的需要)要少得多。它将会在GCC 4.9中出现,甚至可能在某些x > 0的4.8.x版本中也会有。 - Jonathan Wakely
显示剩余19条评论
1个回答

4

好问题。我最近尝试编写类似的代理类,但没有找到好的解决方案。我发现的最佳方法是,在需要将代理作为r-value使用时,调用成员函数:

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

这会改变将某些东西声明为 r-value 的语义,从 std::move(proxy) 变为 proxy.move(),但也允许返回另一种类型的对象(隐式转换为所需类型)。
我的编码实践是始终将代理对象作为 rvalue 传递,这强制手动规定语义(移动、共享引用、复制或其他),但这当然会导致使用错误成为潜在问题(例如,在最终使用 x 之前调用了 x.move())。

感谢 @dhardy;最终我也使用了相同的代理类型,包括 'release' 调用和您提到的相同使用错误。可惜似乎没有解决方法,但我猜这确实证明需要语言扩展是正确的。 - boycy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接