ここの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 クラスとその内部構造を理解したいだけです
それはかなり混乱しています。基本的に、コピー コンストラクターは標準的な意味でのコピー コンストラクターではない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_ref
aを実行します。release
auto_ptr
auto_ptr
コピー元のものを変更するため、舞台裏で起こる奇妙な小さなダンスのようなものです.
C++0x では、auto_ptr
が優先されて廃止されましたunique_ptr
。 コピー コンストラクターunique_ptr
すらなく、新しい「移動コンストラクター」を使用します。これは、移動元のオブジェクトを変更し、役に立たない (ただし有効な) 状態のままにするという事実を明示しています。一時 (別名右辺値) は、移動コンストラクターへの引数として常に明示的に許可されます。
C++0x のムーブ コンストラクターには、他にも多くの大きな利点があります。これにより、標準の STL コンテナーが s を格納し、s を格納できない場合とはunique_ptr
対照的に、正しいことを実行できるようになります。auto_ptr
また、通常、swap 関数の全体的な目的は、決してスローしないムーブ コンストラクターまたはムーブ代入演算子であるため、「swap」関数の必要性がほとんどなくなります。
これは他の期待です。ムーブ コンストラクターとムーブ代入演算子 (デストラクタによく似ています) は、スローすることは想定されていません。
非常に良いリンクと、このテクニックの名前「Move Constructors」または「Colvin-Gibbons trick」を見つけました。
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor
その結果、 を使用してスマート ポインターをコンテナー (QMap など) に格納できますauto_ptr_ref
。 必要なのは、挿入時から初期化してauto_ptr_ref
から操作することだけです。auto_ptr
auto_ptr
auto_ptr_ref