2015-12-31 10 views
10

私は、コピーコンストラクタブルまたはデフォルトコンストラクタブルではないオブジェクトを含むベクトルをソートしようとしていますが、コンパイラがswapの有効な関数を見つけることができないというエラーが発生します。私は移動コンストラクタを持つことで十分だろうと思った。私はここで何が欠けていますか?コピーコンストラクタを持たないオブジェクトでstd :: sortを使用するにはどうすればよいですか?

class MyType { 
public: 
    MyType(bool a) {} 
    MyType(const MyType& that) = delete; 
    MyType(MyType&& that) = default; 
}; 

int main(void) { 
    vector<MyType> v; 
    v.emplace_back(true); 
    sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) { 
     return true; 
    }); 
} 

答えて

20

あなたは、これはstd::sortも(ちょうど建設を動かさない)しようとするものであるとして明示的に、move assignment operatorを定義する必要があります。ユーザ指定のコピーコンストラクタの存在と、ユーザ提供の移動コンストラクタの存在(たとえそれらがdelete -edであっても)によって、移動代入演算子is prohibitedがコンパイラ生成されることに注意してください。例:Howard Hinnant(C++ 11にセマンティクスを移動させるための中心的な寄稿者)によって

#include <vector> 
#include <algorithm> 

class MyType { 
public: 
    MyType(bool a) {} 
    MyType(const MyType& that) = delete; 
    MyType(MyType&& that) = default; 
    MyType& operator=(MyType&&) = default; // need this, adapt to your own need 
}; 

int main(void) { 
    std::vector<MyType> v; 
    v.emplace_back(true); 
    std::sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) { 
     return true; 
    }); 
} 

Live on Coliru

slidesスーパー有用であり、ならびにアイテム17:Effective Modern C++から特殊メンバ関数生成を理解スコットマイヤーズ。

+2

cppreferenceによると、 'std :: sort'は、型をmoveibleとmoveに割り当てる必要があります。 – chris

+0

@chrisはい、私は答えを明らかにしました、ありがとう。 – vsoftco

+1

Spot on。要素はすべて既に存在しているため、移動することはできません。彼らは値を入れ替えるために移動させなければなりません。 –

関連する問題