関数パラメータとしての一意のポインタの使用
一意のポインタは、C 11 のメモリ管理機能を提供します。関数の引数として unique_ptr を渡す場合、考慮すべきアプローチはいくつかあり、それぞれに異なる特徴があります。
値による受け渡し (所有権の譲渡)
Base(std::unique_ptr<Base> n) : next(std::move(n)) {}
このコンストラクターを呼び出すには、ポインターを値により渡し、その所有権を効果的に関数に譲渡する必要があります。
Base newBase(std::move(nextBase));
この操作の後、unique_ptr の所有権が設定されているため、nextBase は空になります。
非定数 L 値参照による受け渡し (所有権の曖昧さ)
Base(std::unique_ptr<Base> &n) : next(std::move(n)) {}
このアプローチでは、実際の L 値 (名前付き変数) が必要です。引数:
Base newBase(nextBase);
この場合、関数がポインタの所有権を主張するかどうかは不明です。 ない。 Base::Base(std::unique_ptr
Const L-Value 参照による受け渡し (所有権の譲渡なし)
Base(std::unique_ptr<Base> const &n);
const L 値参照を渡すと、関数がその所有権を主張できなくなります。ポインタ。この関数は、指定されたオブジェクトにアクセスできますが、その値を変更することはできません。
R 値参照による受け渡し (潜在的な所有権の譲渡)
Base(std::unique_ptr<Base> &&n) : next(std::move(n)) {}
このアプローチは次のようなものです。非定数 L 値参照を渡します。一時オブジェクトを渡すことができます:
Base newBase(std::unique_ptr<Base>(new Base)); // Legal
ただし、非一時的な引数を渡す場合は std::move を使用する必要があります。関数はポインターの所有権を主張する場合もあれば、主張しない場合もありますが、やはり実装を調べないとその動作が明らかではありません。
推奨事項
一意のポインターの操作
一意のポインターを操作するには:
以上がC で一意のポインタを関数パラメータとして渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。