这个让我彻底困惑。在下面的示例中,我收到错误:
错误C2664:'void std :: unique_ptr< _Ty> :: swap(std :: unique_ptr< _Ty> &&)':无法从'const std :: unique_ptr< _Ty>'转换参数1至 “的std ::的unique_ptr< _Ty> &安培;&安培;'
我不知道它是如何结束我的交换功能,或者为什么它是一个问题。 有趣的是,如果我更改如果我更改void swap(const one& other)
的签名并删除const到void swap(one& other)
一切正常。void swap(const one& other)
的签名并删除const到{{它在VS2010中编译但在GCC中仍然被破坏。如果没有交换过载,则没有问题。
void swap(one& other)
修改 非常数要求是有道理的。完全是我的疏忽。为什么它首先调用swap?
(供参考,我使用的是VS2010)
答案 0 :(得分:2)
完整的错误消息如下(我已经介绍了一些防止水平滚动的换行符):
error C2664: 'void std::unique_ptr<_Ty>::swap(std::unique_ptr<_Ty> &&)' : cannot convert parameter 1 from 'const std::unique_ptr<_Ty>' to 'std::unique_ptr<_Ty> &&' with [ _Ty=int ] Conversion loses qualifiers
错误发生在代码的以下行:
void swap(const one& other){ x.swap(other.x); }
other
是const限定的,但std::unique_ptr::swap
需要非const参数。因此,“转换失去限定符”(具体地说,是限定词)。
答案 1 :(得分:1)
对我来说,这似乎很简单。当您交换两个对象时,它们都不是只读的。它们都应该是可修改的,只有交换才能完成。
所以你的swap
函数必须采用非const引用。
请注意,std::unique_ptr<T>
没有swap
函数,该函数带有 rvalue 引用。事实上,拥有一个甚至没有多大意义。 VS2010在这方面是非标准的。标准(§20.7.1.2)只需要一个带有此签名的标准:
void swap(std::unique_ptr<T> &) noexcept;
rvalue-reference没有swap
。我还建议您删除带有rvalue-reference的交换。它会给代码增加不必要的复杂性。