这让我彻底糊涂了。在下面的示例中,我收到错误:
错误 C2664: 'void std::unique_ptr<_Ty>::swap(std::unique_ptr<_Ty> &&)' : 无法将参数 1 从 'const std::unique_ptr<_Ty>' 转换为 'std::unique_ptr<_Ty > &&'
我不知道它是如何以我的交换功能结束的,或者为什么它是一个问题。有趣的是,如果我更改签名如果我更改签名void swap(const one& other)
并将 const 删除,void swap(one& other)
一切正常。void swap(const one& other)
并删除 const ,void swap(one& other)
它会在 VS2010 中编译,但在 GCC 中仍然被破坏。如果没有交换重载,则没有问题。
//-----------------------------------------------------------------------------
class one
{
public:
one(){}
one(one&& other) : x(std::move(other.x)) {}
one& operator=(one&& other){ x = std::move(other.x); return *this; }
void swap(const one& other){ x.swap(other.x); }
void swap(one&& other){ x.swap(std::move(other.x)); }
private:
one(const one&);
one& operator=(const one&);
std::unique_ptr<int> x;
};
//-----------------------------------------------------------------------------
void swap(one& left, one& right)
{
left.swap(right);
}
//-----------------------------------------------------------------------------
void swap(one&& left, one& right)
{
right.swap(std::move(left));
}
//-----------------------------------------------------------------------------
void swap(one& left, one&& right)
{
left.swap(std::move(right));
}
//-----------------------------------------------------------------------------
class two
{
public:
two(){}
two(two&&){}
two& operator=(two&&){ return *this; }
operator one(){return one();}
private:
two(const two&);
two& operator=(const two&);
};
//-----------------------------------------------------------------------------
int main()
{
std::vector<two> twos(10);
std::vector<one> ones(std::make_move_iterator(twos.begin()), std::make_move_iterator(twos.end()));
}
编辑: 非常量要求是有道理的。完全是我的疏忽。为什么它首先调用交换?
(供参考,我用的是VS2010)