ホームページ >バックエンド開発 >C++ >C で std::move を使わずに std::unique_ptr を返すことはできますか?

C で std::move を使わずに std::unique_ptr を返すことはできますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-15 02:42:09465ブラウズ

Can I Return a `std::unique_ptr` Without `std::move` in C  ?

std::move を使用せずに std::unique_ptr を返す

C では、 std::unique_ptr はオブジェクトの複数の所有権を防ぐために移動セマンティクスを強制します。ただし、std::move を呼び出さずに関数から unique_ptr を返すことは可能です。この動作は、コピー省略と呼ばれる言語機能に起因すると考えられます。

コピー省略

C 言語仕様 (12.8 §34 および §35) によれば、実装では省略 (省略) が許可されています。 ) 特定の基準が満たされた場合のコピー/移動操作。具体的には、式が関数の戻り値の型と同じ cv 非修飾型を持つ不揮発性自動オブジェクトの名前である場合、クラスの戻り値の型の return ステートメントでコピー省略が許可されます。

Elision unique_ptr の Return ステートメント

で提供したコード例では、

unique_ptr<int> foo()
{
  unique_ptr<int> p(new int(10));
  return p;  // Line 1
}
p は関数の戻り値の型 unique_ptr と同じ型を持つ不揮発性自動オブジェクト。したがって、コンパイラーは p のコピー構築を省略することができます。

コンパイラーは行 1 に遭遇すると、最初にオーバーロード解決を実行して、p が右辺値で指定されているかのように、コピー操作のコンストラクターを選択します。ただし、省略の基準が満たされているため、コピーの構築は省略され、戻り値は移動された unique_ptr になります。

ベスト プラクティスへの影響

値によって返すことに注意することが重要です。このシナリオではデフォルトの選択である必要があります。コピー省略が存在する場合、return ステートメント内の名前付き値は右辺値として扱われます。これは、明示的に std::move を使用しなくても、返された unique_ptr を関数の一時オブジェクトから移動できることを意味します。

参照によって返すか、std::make_unique を使用することは、どちらもコピー省略を回避し、明示的であることを保証するための実行可能な代替手段です。所有権の譲渡

以上がC で std::move を使わずに std::unique_ptr を返すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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