2013-05-13 1 views
5

私は、コピーの作成とコピーの割り当てに深いコピーを実行する大きなオブジェクトを管理するコンテナを作りたいと思っています。デフォルトの生成された移動メンバーは何をしますか?

template <class TBigObject> 
class Container : public std::vector< std::shared_ptr<TBigObject> > 
{ 
public: 
    Container(int nToAllocate){ /* fill with default constructed TBigObjects */ } 
    Container(const Container& other){ /* deep copy */ } 
    Container(Container&&) = default; 
    Container& operator = (const Container& population){ /* deep copy */ } 
    Container& operator = (Container&&) = default; 
}; 

私は、不履行が何を知りたいのです:

Container(Container&&) = default; 
Container& operator = (Container&&) = default; 

メンバーが実際に行います。

私が呼び出す場合:

Container<int> makeContainer() 
{ 
    ... 
} 

とでデバッグブレークポイントを設定します。

Container<int> moveAssigned; 
moveAssigned = makeContainer(); // EDIT corrected thanks to Andy Prowl 
Container<int> moveConstructed(makeContainer()); 

とコピーコンストラクタと代入演算子の内側、デバッガはこれらのブレークポイントの上にジャンプします。実際にはデフォルトの移動メンバーはディープコピーを実行せず、すべてのサブオブジェクトを移動しているようです。

この動作は標準で保証されていますか?既定の移動メンバーは直感的に動作し、すべてのサブオブジェクトを移動しますか?

+5

明示的に許可されていない限り、標準型から継承しません。 – bitmask

+0

@bitmaskしかし、私は多態的な動作や複雑な機能を望んでいません。私は単純にディープコピー機能を追加したいだけです。これが私を苦しめることができる方法はありますか?この問題についていくつかのリソースをお持ちですか? –

+0

私の場合は、私の場合、この質問は、http://stackoverflow.com/questions/4353203/thou-shalt-not-inherit-from-stdvector適用 –

答えて

8

デフォルトの移動メンバーは直感的に動作し、すべてのサブオブジェクトを移動しますか?

はい。段落C++ 11標準の12.7/15パー:

、暗黙的に定義されたコピー/非組合クラスXがmemberwiseのコピーを実行するために、コンストラクタを移動/その拠点とメンバーの を移動します。 [...]

ところで、この:

Container<int> moveAssigned = makeContainer(); 

ない移動の割り当てが、コピーの初期化構文を使用して移動建設です。移動の割り当ては、このようになります:

Container<int> moveAssigned; 
// ... 
moveAssigned = makeContainer(); // <== MOVE ASSIGNMENT HERE 

この違い:

Container<int> c(make_container()); 

をそして、この:

Container<int> c = make_container(); 

は、概念的にその、第二のケース一時的で最初にタイプContainer<int>のオブジェクトが右側の式から構築され、次にcはこの一時的なものから移動構築されます。

最初のケースでは、がmake_container()によって返されたオブジェクトから直接構築されることを意味する直接的な初期化があります。

私が「概念的に」という言葉を強調したのは、実際にはコンパイラがコピーエリミッションを実行できるため、2番目のバージョンは最初のものに最適化される可能性が高い(コピーコンストラクタや移動コンストラクタまだコンパイラによってチェックされていなければなりません)。

関連する問題