10

ここのauto_ptr_refドキュメントはこれを 言います

This is an instrumental class to allow certain conversions that allow auto_ptr objects to be passed to and returned from functions.

auto_ptr_ref がこれを達成するのにどのように役立つかを誰かが説明できますか? auto_ptr クラスとその内部構造を理解したいだけです

4

3 に答える 3

15

それはかなり混乱しています。基本的に、コピー コンストラクターは標準的な意味でのコピー コンストラクターではないauto_ptr_refため、存在します。auto_ptr

コピー コンストラクターには通常、次のような署名があります。

X(const X &b);

auto_ptrコピー コンストラクターには、次のような署名があります。

X(X &b)

これはauto_ptr、 の所有権セマンティクスを容易にするために、ポインタを 0 に設定するためにコピー元のオブジェクトを変更する必要があるためですauto_ptr

場合によっては、引数が宣言されていないコピー コンストラクターと一時変数が一致しないことがありますconst。ここでauto_ptr_ref出番です。コンパイラは非 const バージョンのコピー コンストラクターを呼び出すことはできませんが、変換演算子を呼び出すことはできます。変換演算子はauto_ptr_ref、ポインターの一時ホルダーのようなオブジェクトを作成します。auto_ptrコンストラクタ oroperator =は、引数で呼び出されますauto_ptr_ref

お気付きのように、コピー コンストラクターと同様に、auto_ptr自動的に an に変換されるin の変換演算子がsourceに対してauto_ptr_refaを実行します。releaseauto_ptr

auto_ptrコピー元のものを変更するため、舞台裏で起こる奇妙な小さなダンスのようなものです.

C++0x および unique_ptr に関するランダム関連タンゲット

C++0x では、auto_ptrが優先されて廃止されましたunique_ptrコピー コンストラクターunique_ptrすらなく、新しい「移動コンストラクター」を使用します。これは、移動元のオブジェクトを変更し、役に立たない (ただし有効な) 状態のままにするという事実を明示しています。一時 (別名右辺値) は、移動コンストラクターへの引数として常に明示的に許可されます。

C++0x のムーブ コンストラクターには、他にも多くの大きな利点があります。これにより、標準の STL コンテナーが s を格納し、s を格納できない場合とはunique_ptr対照的に、正しいことを実行できるようになります。auto_ptrまた、通常、swap 関数の全体的な目的は、決してスローしないムーブ コンストラクターまたはムーブ代入演算子であるため、「swap」関数の必要性がほとんどなくなります。

これは他の期待です。ムーブ コンストラクターとムーブ代入演算子 (デストラクタによく似ています) は、スローすることは想定されていません。

于 2010-01-23T02:53:40.917 に答える
1

非常に良いリンクと、このテクニックの名前「Move Constructors」または「Colvin-Gibbons trick」を見つけました。

http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor

于 2010-01-23T03:31:36.330 に答える
0

その結果、 を使用してスマート ポインターをコンテナー (QMap など) に格納できますauto_ptr_ref。 必要なのは、挿入時から初期化してauto_ptr_refから操作することだけです。auto_ptrauto_ptrauto_ptr_ref

于 2011-12-07T11:01:21.703 に答える