【问题标题】:Workarounds for no 'rvalue references to *this' feature没有“对 *this”功能的右值引用的解决方法
【发布时间】:2013-01-11 20:20:26
【问题描述】:

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

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

【问题讨论】:

  • 我认为你能得到的最接近的是一个显式进行转换的函数,而不是一个转换运算符,所以你不得不说convert_proxy(p),它为右值重载和左值返回T&amp;&amp;const T&amp; ...但这使得代理的使用不透明,这可能不是你想要的
  • 我很好奇。对不起,缺乏理解,但我想得到它。如果您删除新提出的&amp;&amp;&amp; 修饰符,您究竟缺少什么?
  • 记录在案,give it a go inclang 2.9
  • 不知情的无耻插件:What is "rvalue reference for *this"?
  • @Omnifarious,只是因为它还没有实现。这是缺少的最后一个核心语言功能,但对它的需求(或恕我直言)远少于 lambda、右值引用等。它将在 GCC 4.9 中,对于某些 x &gt; 0 甚至可能是 4.8.x

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢@dhardy;我最终得到了完全相同的代理类型,带有“发布”调用和您提到的相同使用错误。可惜似乎没有解决方法,但我想这确实使所需的语言扩展成为一个很好的案例。
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2010-11-18
  • 2012-01-26
相关资源
最近更新 更多