为什么我的交换方法会干扰make_move_iterator?

时间:2013-01-23 17:57:07

标签: c++ c++11 iterator move-semantics

这个让我彻底困惑。在下面的示例中,我收到错误:

  

错误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)的签名并删除co​​nst到void swap(one& other)一切正常。如果我更改void swap(const one& other)的签名并删除co​​nst到{{它在VS2010中编译但在GCC中仍然被破坏。如果没有交换过载,则没有问题。

void swap(one& other)

修改 非常数要求是有道理的。完全是我的疏忽。为什么它首先调用swap?

(供参考,我使用的是VS2010)

Demo of it broken

Demo of it still broken, but this 'fix' works in VS2010

2 个答案:

答案 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的交换。它会给代码增加不必要的复杂性。