このリンクauto_ptrの auto_ptr ドキュメントを調べ ていましたが、なぜそれが行われたのか完全には理解できませんでした。インターフェイス セクションには、コピー コンストラクターの宣言が 2 つあります。
1)
auto_ptr(auto_ptr<X>&) throw ();
2)
template <class Y>
auto_ptr(auto_ptr<Y>&) throw();
これは何の目的で。
ポインターを暗黙的に変換できる場合に備えてあります。
struct base {};
struct derived : base {};
std::auto_ptr<derived> d(new derived);
std::auto_ptr<base> b(d); // converts
また、質問はしていませんが、コピー コンストラクターが非 const であることに気付くでしょう。これは、auto_ptr
がポインターの所有権を取得するためです。上記のサンプルでは、afterb
が構築さd
れ、何も保持されません。これはauto_ptr
、コピーできないため、コンテナーでの使用には適していません。
C++0xは捨てauto_ptr
て、 と呼ばれるものを作りunique_ptr
ます。このポインターは同じ目標を持っていますが、移動セマンティクスにより正しく達成されます。つまり、コピーはできませんが、所有権を「移動」できます。
std::unique_ptr<derived> d(new derived);
std::unique_ptr<base> b(d); // nope, cannot be copied
std::unique_ptr<base> b(std::move(d)); // but can be moved
これはunique_ptr
、値をコピーするのではなく移動するため、コンテナでの使用に適しています。
1 つ目はコピー コンストラクターで、2 つ目はauto_ptr
他のテンプレート パラメーターを使用したテンプレート コンストラクターです。
コンパイラが生成したものを望まない場合、実装は非テンプレート コピー コンストラクターを提供する必要があります。これは、コピー コンストラクターとして使用できるテンプレート化されたコンストラクターは、コンパイラーによって生成されるコンストラクターを抑制せず、コンパイラーによって生成されるコンストラクターは、テンプレートではないため、常にコピーの構築により適しているためです。