4

クラスIdを使用するオブジェクトAの移動コンストラクタを実装しようとしています。クラスIDが自動的に生成され、将来のコーディングのために私はそうするときにデフォルトのコンストラクタを削除することを選択しました。しかしC++削除されたデフォルトのコンストラクタを持つオブジェクトに対してスワップを使用できない理由

私はIdのデフォルトコンストラクタがを削除されたことを不平を言っているAの移動のコンストラクタでスワップを使用してみてください。スワップは新しいオブジェクトを作成していないと思っていましたが、2つのアイテムのアドレスを交換するだけでした。

私はそれを誤解していますが、実際にはIdの3番目の一時的なインスタンスを作成していますか?

この場合、移動コンストラクタを実装する最善の方法は何ですか?

私は以下の最低限の例が含まれている:あなた問題がない、Idオブジェクトにswapを使用することができます

In constructor 'A::A(A&&)': 
21:18: error: use of deleted function 'Id::Id()' 
8:5: note: declared here 
In file included from /usr/include/c++/4.9/bits/stl_pair.h:59:0, 
       from /usr/include/c++/4.9/bits/stl_algobase.h:64, 
       from /usr/include/c++/4.9/bits/char_traits.h:39, 
       from /usr/include/c++/4.9/ios:40, 
       from /usr/include/c++/4.9/ostream:38, 
       from /usr/include/c++/4.9/iostream:39, 
       from 2: 
/usr/include/c++/4.9/bits/move.h: In instantiation of 'void std::swap(_Tp&, _Tp&) [with _Tp = A]': 
34:17: required from here 
/usr/include/c++/4.9/bits/move.h:176:11: error: use of deleted function 'A& A::operator=(const A&)' 
     __a = _GLIBCXX_MOVE(__b); 
     ^
15:7: note: 'A& A::operator=(const A&)' is implicitly declared as deleted because 'A' declares a move constructor or move assignment operator 
In file included from /usr/include/c++/4.9/bits/stl_pair.h:59:0, 
       from /usr/include/c++/4.9/bits/stl_algobase.h:64, 
       from /usr/include/c++/4.9/bits/char_traits.h:39, 
       from /usr/include/c++/4.9/ios:40, 
       from /usr/include/c++/4.9/ostream:38, 
       from /usr/include/c++/4.9/iostream:39, 
       from 2: 
/usr/include/c++/4.9/bits/move.h:177:11: error: use of deleted function 'A& A::operator=(const A&)' 
     __b = _GLIBCXX_MOVE(__tmp); 
+0

を初期化する必要がありますか? –

答えて

6

:コンパイラは、次のエラーを返します

class Id { 

public: 
    Id() = delete; 
    Id(std::string id) : m_id(id) {} 

private: 
    std::string m_id; 
}; 

class A { 

public: 
    A() = delete; 
    A(Id id) : m_id(id) {} 


    A(A&& other) { 
     std::swap(m_id, other.m_id); 
    } 

private: 
    Id m_id; 
}; 

をしかし、Aのコンストラクタにあります。

A(A&& other) { 
    std::swap(m_id, other.m_id); 
} 

これはデフォルトではIdを構築され、その後、他のAのメンバーとそれを交換します。デフォルトコンストラクタを回避するために

、あなたはワンステップでその作業を行う入れ替えることができますどのように初期化子リストでId

A(A&& other) : m_id(std::move(other.m_id)) 
{ } 
関連する問題