2

auto_ptr は = 演算子の rhs 値を削除するため、auto_ptr に STL コンテナーを使用しないでください。

だから私は2つの質問があります:

1) これは、この振る舞いを持つすべてのクラスをコンテナーで使用してはならないということですか?

2) どのような容器を使用できますか?

4

3 に答える 3

3

1)これは、この動作をするすべてのクラスをコンテナーで使用してはならないことを意味しますか?

はい、確かに、それは正しいコピー動作ではないためです。コピーは後でソースと等しくないため、ソースを破壊します。これは、C ++ 11より前のmove-semanticsの壊れた実装の一種であり、の厳密な一意の所有権セマンティクスに必要ですstd::auto_ptr

2)どのような容器を使用できますか?

本当の答えは、実際には、この動作(コピーコンストラクター/そのソースを破壊する代入)を持つクラスは存在してはならないということです。そして幸いなことに、C ++ 11には適切な移動セマンティクスがあり、この破壊的なコピーを安全な方法で実現するため、これはもう必要ありません(簡単に言うと、ソースが本当に必要なくなった場合のみ)。

したがってstd::auto_ptr、非推奨であり、使用しないでください。std::unique_ptr移動可能ですがコピー可能ではないものに置き換えられました。ただし、C ++ 11コンテナーは、必要に応じてコピーするのではなく要素を移動するためstd::unique_ptr、標準コンテナー内で完全に使用できます。コンテナをコピーしたり、sのコピーを必要とする単一のオブジェクトで埋めたりすることはできませんstd::unique_ptrが、これらの操作は、一意の所有権のセマンティクスに対して概念的に間違っているため、とにかく機能しないはずです。

ちなみに、実際に理由で選択std:auto_ptrした場合、つまり一意の所有権セマンティクスが必要な場合、std::shared_ptr(他の回答で示唆されているように)aは共有所有権を示すため、明らかに間違っています。std::unique_ptr今日ですstd::auto_ptr。s(または生のポインタですが、あなたの質問から、そのオプションを除外します)が適切なstd::shared_ptr場所にスパムを送信しないでください。std::unique_ptr

于 2012-09-13T08:49:36.113 に答える
2

丁度。一般に、シーケンス コンテナー要素は CopyConstructible および Assignable である必要があります。これは、以下が必要であることを意味します。

  • パブリック コピー コンストラクター
  • パブリック代入演算子

連想コンテナー (set<> および map<>) も厳密な弱い順序付けを提供する必要があります。つまり、operator <定義する必要があります (または専用の比較関数)。

C++ 標準の 23.1 章に詳細な要件が記載されています。

于 2012-09-13T08:21:16.637 に答える
2

自動ポインターには非常に厳密な所有権があります。自動ポインターだけが、それが指すオブジェクトの存続期間に責任を負います。をコピーするauto_ptrと、それが指しているものへの参照が失われます。

問題は、STL コンテナーが処理を行う方法にあります。たとえば、要素を追加する場合、コンテナが拡張してより多くのメモリを取得する場合があります。これにより、すべての値が新しいメモリにコピーされ、それ自体が auto_ptrs を失うことになります。

連想コンテナは、追加のメモリを割り当てるときに自分自身を完全にコピーしない可能性があると思いますが、誰かが確認できる場合は、コメントを投稿するか、回答を編集してくださいとにかく危険を冒さないほうがいい。

またAuto_ptr、C++0x 以降では推奨されていないことに注意してくださいunique_ptr。代わりに使用することをお勧めします。あなたの場合、std::shared_ptrあなたのオブジェクトの一意の所有権が本当に必要でない限り、おそらくうまくいくでしょう。

于 2012-09-13T08:18:49.177 に答える