コンストラクターと関数で unique_ptr パラメーターを処理する方法
シナリオ
クラスを検討する自分自身を次のように参照するベース
class Base { public: typedef unique_ptr<Base> UPtr; Base() {} Base(Base::UPtr n) : next(std::move(n)) {} virtual ~Base() {} void setNext(Base::UPtr n) { next = std::move(n); } protected: Base::UPtr next; };
unique_ptr 引数を渡すメソッド
unique_ptr パラメータを効果的に使用するには、次の方法を検討してください。
1.値による (A)
Base(std::unique_ptr<Base> n) : next(std::move(n)) {}
Base newBase(std::move(nextBase)); として呼び出されると、このメソッドはポインターの所有権を関数に譲渡します。構築後、nextBase は空になります。
2.非 const l-value による参照 (B)
Base(std::unique_ptr<Base> &n) : next(std::move(n)) {}
これには実際の l-value (名前付き変数) が必要で、関数が潜在的にポインターの所有権を主張できるようになります。
3. const l-value による参照 (C)
Base(std::unique_ptr<Base> const &n);
これにより、関数がポインターを格納することはできなくなりますが、実行中はオブジェクトへのアクセスが保証されます。
4. r-value による参照 (D)
Base(std::unique_ptr<Base> &&n) : next(std::move(n)) {}
(B) と似ていますが、一時的ではない引数を渡すときに std::move を使用する必要があります。関数は所有権を要求する場合もあれば、所有権を要求しない場合もあります。
推奨事項
unique_ptr の操作
unique_ptr を移動するには、std::move を使用します。これにより、コピーが回避され、所有権が適切に譲渡されることが保証されます。
以上がC コンストラクターおよび関数で「unique_ptr」パラメーターをどのように渡す必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。