ホームページ >バックエンド開発 >C++ >C コンストラクターおよび関数で「unique_ptr」パラメーターをどのように渡す必要がありますか?

C コンストラクターおよび関数で「unique_ptr」パラメーターをどのように渡す必要がありますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-18 10:08:11210ブラウズ

How Should `unique_ptr` Parameters Be Passed in C   Constructors and Functions?

コンストラクターと関数で 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 を使用する必要があります。関数は所有権を要求する場合もあれば、所有権を要求しない場合もあります。

推奨事項

  • メソッド (A) は、関数に所有権を譲渡するときに使用する必要があります。 .
  • メソッド (C) は、単純に
  • 方法 (D) は、所有権の譲渡に関するあいまいさのため避けるべきです。

unique_ptr の操作

unique_ptr を移動するには、std::move を使用します。これにより、コピーが回避され、所有権が適切に譲渡されることが保証されます。

以上がC コンストラクターおよび関数で「unique_ptr」パラメーターをどのように渡す必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。