ホームページ >バックエンド開発 >C++ >C で `std::make_unique` はどのようにして完全な転送を実現するのでしょうか?

C で `std::make_unique` はどのようにして完全な転送を実現するのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-26 02:40:09317ブラウズ

How Does `std::make_unique` Achieve Perfect Forwarding in C  ?

make_unique と完全転送

C 11 には、一意のポインターの簡潔なインスタンス化を可能にする組み込みの std::make_unique 関数がありません。開発者は、構文

std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));

が不必要に冗長であると判断し、代替構文を提案しました:

auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);

このアプローチにより、一意のポインターの作成が簡素化され、コードの重複が削減されます。

提案されている std::make_unique の実装では、完全転送を使用します。 std::forward を使用してコンストラクターに引数を渡します。完全転送により、元の型と値のカテゴリ (左辺値、右辺値など) を保持しながら、関数パラメータが最も効率的な方法で渡されることが保証されます。

make_unique 実装では、構文

std::forward<Args>(args)...

次のように解釈できます

  • std::forward: Args の値カテゴリ (lvalue または rvalue など) を推定する型特性。
  • args...: の拡張変数引数を個々のパラメータに変換します。

これらを組み合わせることで、完全な転送が実現されます。引数が正しい値のカテゴリと型でコンストラクターに渡されるようにします。

C 標準化委員会の委員長である Herb Sutter は、C 11 に std::make_unique を含めなかったという見落としを認め、次のように指摘しました。将来のバージョンで追加される予定です。推奨される実装は、質問で提供されているものと同じです。

C 14 の導入により、std::make_unique が標準化され、一意のポインターを作成するための要求された簡潔な構文が提供されました。

以上がC で `std::make_unique` はどのようにして完全な転送を実現するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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