これは私を完全に混乱させます。以下のサンプルでは、エラーが発生します。
エラー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を使用しています)