コピー構築とコピー割り当てでディープコピーを実行する大きなオブジェクトを管理するコンテナーを作成したいと考えています。
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());
コピー コンストラクターと代入演算子の内部では、デバッガーはこれらのブレークポイントを飛び越えます。そのため、デフォルトの移動メンバーは実際にはディープ コピーを実行せず、すべてのサブオブジェクトを移動しているようです。
この動作は標準で保証されていますか? デフォルトの移動メンバーは直感的に動作し、すべてのサブオブジェクトを移動しますか?