web-dev-qa-db-ja.com

auto_ptrは非推奨ですか?

  1. Auto_ptrは、着信C++標準で非推奨になりますか?
  2. Shared_ptrの代わりにunique_ptrを所有権の譲渡に使用すべきですか?
  3. Unique_ptrが標準にない場合、代わりにshared_ptrを使用する必要がありますか?
76
dimba

更新:この回答は2010年に書かれ、予想どおりstd::auto_ptrは廃止されました。アドバイスは完全に有効です。

C++ 0x std::auto_ptrは非推奨となり、std::unique_ptr。スマートポインタの選択は、ユースケースと要件によって異なります。std::unique_ptrコンテナー内で使用できる単一所有権の移動セマンティクス(移動セマンティクスを使用)およびstd::shared_ptr所有権が共有されている場合。

状況に最適なスマートポインターを使用してみてください。正しいポインターの種類を選択すると、他のプログラマーがデザインを理解できるようになります。

はい、今日の時点でauto_ptrはC++ 0xで非推奨になり、代わりにunique_ptrを使用する必要があります。最新のドラフト標準(n3035)のセクションD.9から

クラステンプレートauto_ptrは非推奨です。 [注:クラステンプレートunique_ptr(20.9.10)は、より良いソリューションを提供します。 —注を終了]

基準が批准されるまで、委員会がこの決定を改訂する可能性は常にありますが、この決定はそうではないと思います。

20

_auto_ptr_が廃止された C++ 11(D.10、1228ページ) だけでなく、deletedC++ の将来のバージョンでは:

N4190を採用し、(非推奨ではなく)C++標準ライブラリから_auto_ptr_、_bind1st_などのいくつかの古風なものを実際に削除しました/ _bind2nd_、_ptr_fun_/_mem_fun_/_mem_fun_ref_、_random_shuffle_、その他いくつか。これらはドラフトC++ 17標準ライブラリからすべて削除され、将来のポータブルC++の一部ではなくなります。

それに関する別のドキュメント: Programming Language C++、Library Evolution Working Group-Document N4190 、詳細情報が必要な場合。

代わりに_auto_ptr_を使用することにより、_unique_ptr_を自動的に使用して任意のコードを変換できます。

_auto_ptr_を使用するコードは、_unique_ptr_が「コピー」されるたびにmove()を挿入して、_auto_ptr_を使用するように機械的に変換できます。

15
Maxime Lorant

いいえ、廃止されていません。 C++ 0xがこれまでに受け入れられていれば、そうかもしれません。そして、現実的には常にサポートされます。廃止予定の機能が実際のC++実装から削除されたことはないと思います。

4
anon