回答:
auto_ptr
(既知の結果とともに)をコピーできるため、グローバルな検索/置換はできませんが、unique_ptr
移動のみが可能です。どんなものでも
std::auto_ptr<int> p(new int);
std::auto_ptr<int> p2 = p;
少なくともこのようになる必要があります
std::unique_ptr<int> p(new int);
std::unique_ptr<int> p2 = std::move(p);
その他の違いについてunique_ptr
は、配列を正しく処理できます(は呼び出されますがdelete[]
、は呼び出さauto_ptr
れますdelete
。
std::auto_ptr
そしてstd::unique_ptr
somewaysなどで代替の低下に互換性がありません。したがって、検索/置換を行うだけでは不十分です。ただし、コンパイルエラーを処理して検索/置換を行うと、奇妙なコーナーケースを除くすべてが修正されます。ほとんどのコンパイルエラーでは、を追加する必要がありstd::move
ます。
unique_ptr
あります。s はstd::move
呼び出しを通じて渡す必要があります。正しくないとコンパイラが文句を言うので、これは簡単です。std::auto_ptr
コピーのセマンティクスは悪です。クラスがコピーを許可しない場合、それstd::unique_ptr
は置き換えのドロップです。ただし、クラスに適切なコピーセマンティクスを提供しようとした場合は、std::auto_ptr
処理コードを変更する必要があります。正しくないとコンパイラが文句を言うので、これは簡単です。特別なコードなしでstd::auto_ptr
メンバーを持つクラスのコピーを許可した場合は、あなたに恥と幸運を祈ります。要約するstd::unique_ptr
と、壊れていないstd::auto_ptr
です。を使用するときにエラーになることが多かった動作をコンパイル時に許可しませんstd::auto_ptr
。したがって、std::auto_ptr
必要に応じて注意して使用する場合、への切り替えstd::unique_ptr
は簡単です。std::auto_ptr
の奇妙な動作に依存している場合は、とにかくコードをリファクタリングする必要があります。
私の知る限り、unique_ptr
直接の代替品ではありません。修正される主な欠陥は、所有権の暗黙の移転です。
std::auto_ptr<int> a(new int(10)), b;
b = a; //implicitly transfers ownership
std::unique_ptr<int> a(new int(10)), b;
b = std::move(a); //ownership must be transferred explicitly
一方、unique_ptr
は完全に新しい機能を備えています。コンテナに格納できます。
auto_ptr
許可されないことも述べました。
Herb SutterがGotW#89について説明しています:
auto_ptrとの関係は何ですか?auto_ptrは、C ++が移動セマンティクスを持つ前に、unique_ptrを作成しようとする勇敢な試みとして最も魅力的に特徴付けられています。auto_ptrは非推奨になりました。新しいコードでは使用しないでください。
既存のコードベースにauto_ptrがある場合、機会があったら、auto_ptrからunique_ptrへのグローバルな検索と置換を試してください。大部分の用途は同じように機能し、(コンパイル時のエラーとして)発見したり、知らなかったバグを修正したり(サイレントに)したりする可能性があります。
言い換えると、グローバルな検索と置換はコードを一時的に「破壊」する可能性がありますが、とにかくそれを行う必要があります。コンパイルエラーを修正するのに少し時間がかかる場合がありますが、長期的にははるかに多くのトラブルを節約できます。