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)...
次のように解釈できます
これらを組み合わせることで、完全な転送が実現されます。引数が正しい値のカテゴリと型でコンストラクターに渡されるようにします。
C 標準化委員会の委員長である Herb Sutter は、C 11 に std::make_unique を含めなかったという見落としを認め、次のように指摘しました。将来のバージョンで追加される予定です。推奨される実装は、質問で提供されているものと同じです。
C 14 の導入により、std::make_unique が標準化され、一意のポインターを作成するための要求された簡潔な構文が提供されました。
以上がC で `std::make_unique` はどのようにして完全な転送を実現するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。