3

このリンクauto_ptrの auto_ptr ドキュメントを調べ ていましたが、なぜそれが行われたのか完全には理解できませんでした。インターフェイス セクションには、コピー コンストラクターの宣言が 2 つあります。

1)

auto_ptr(auto_ptr<X>&) throw (); 

2)

template <class Y> 
     auto_ptr(auto_ptr<Y>&) throw(); 

これは何の目的で。

4

2 に答える 2

5

ポインターを暗黙的に変換できる場合に備えてあります。

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、値をコピーするのではなく移動するため、コンテナでの使用に適しています。

于 2010-01-23T01:15:30.320 に答える
5

1 つ目コピー コンストラクターで、2 つ目はauto_ptr他のテンプレート パラメーターを使用したテンプレート コンストラクターです。

コンパイラが生成したものを望まない場合、実装は非テンプレート コピー コンストラクターを提供する必要があります。これは、コピー コンストラクターとして使用できるテンプレート化されたコンストラクターは、コンパイラーによって生成されるコンストラクターを抑制せず、コンパイラーによって生成されるコンストラクターは、テンプレートではないため、常にコピーの構築により適しているためです。

于 2010-01-23T01:16:46.183 に答える