我有一个围绕一个可移动对象的代理容器类,并希望代理能够隐式地产生对底层对象的右值引用,但仅在代理本身被移动时。
我相信我可以根据提案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;
};
答案 0 :(得分:4)
好问题。我最近尝试编写类似的代理类,但从未实现过一个好的解决方案。我发现最好的是在每个需要代理需要为r值的用途上调用成员函数:
ORef<T> move() {
return ORef<T>( this->release() );
}
这改变了将某个r值从std::move(proxy)
声明为proxy.move()
的语义,但也允许返回不同类型的对象(可隐式转换为所需类型)的可能性。 / p>
我使用它的编码实践是始终将代理对象作为rvalues传递,强制手动指定语义(移动,共享引用,复制或其他),但这当然会使使用错误成为一个潜在的问题(例如调用{{1}在x.move()
)的最终用法之前。