auto_ptrは非推奨ですか?


83
  1. auto_ptrは今後のC ++標準で非推奨になりますか?
  2. shared_ptrの代わりにunique_ptrを所有権の譲渡に使用する必要がありますか?
  3. unique_ptrが標準にない場合、代わりにshared_ptrを使用する必要がありますか?

回答:


80

更新:この回答は2010年に作成され、予想どおりstd::auto_ptr非推奨になりました。アドバイスは完全に有効です。

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

状況に最も適したスマートポインターを使用するようにしてください。正しいポインタータイプを選択すると、他のプログラマーに設計への洞察が得られます。


22

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

クラステンプレートauto_ptrは非推奨です。[注:クラステンプレートunique_ptr(20.9.10)は、より優れたソリューションを提供します。—エンドノート]

基準が承認されるまで、委員会がこの決定を修正する可能性は常にありますが、この決定はありそうもないと思います。


18

C ++ 11(D.10、1228ページ)auto_ptr非推奨になるだけでなく、C ++の将来のバージョンで削除 される予定です

N4190を採用し、実際に削除などのC ++標準ライブラリのいくつかの古風なもの、(単に非推奨ではない)auto_ptrbind1st/ bind2ndptr_fun/ mem_fun/をmem_fun_refrandom_shuffle、といくつかのより多くの。これらはすべてドラフトC ++ 17標準ライブラリから削除され、将来のポータブルC ++の一部にはなりません。

それに関する別のドキュメント:プログラミング言語C ++、ライブラリ進化ワーキンググループ-詳細情報が必要な場合は、ドキュメントN4190

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

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


3

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


5
C ++標準は一度だけ更新されており、それは基本的に単なる技術的な正誤表でした(つまり、引用された問題に修正されました)。それが何も削除しなかったことは驚くべきことではありません。OTOH、古い機能は最終的にコンパイラから削除されます。たとえば、おそらく<iostream.h>これまでに使用されたよりも多くのC ++auto_ptrが使用されていますが、MS VC ++(1つ)はそれを提供していません。
ジェリーコフィン

1
@Jerry iostream.hは、標準の一部ではありませんでした。そのため、非推奨ではありません。

@Neil:いいえ、でもよく使われました。auto_ptrは標準の一部ですが、使用量は大幅に少なくなっています。実用的な観点からは、その除去による影響は大幅に少なくなります。
ジェリーコフィン2010年

2
@Jerryよく私はauto_ptrをよく使用し、iostream.hはまったく使用しません。C ++の標準的なcomiteeは、非推奨になると、集合的なボンネットに少し蜂がいると思うことがあります。元の文字列ストリームのように明らかに間違っていたものもありましたが、完全に使用可能な「static」キーワードの代わりに名前のない名前空間を使用するというアイデアのようなものは、完全にばかげていました。

1
@ニール:まあ、それを見通しに入れてみましょう。私が個人的に何をしているかに関係なく、「<iostream.h>」をグーグル検索すると最大263,000ヒットが得られ、auto_ptrと同じことを行うと最大66,000ヒットになると考えてください。
ジェリーコフィン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.