ホームページ >バックエンド開発 >C++ >`std::forward` がテンプレート引数の推論を無効にするのはなぜですか?

`std::forward` がテンプレート引数の推論を無効にするのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-12 22:47:02298ブラウズ

Why does `std::forward` disable template argument deduction?

std::forward でテンプレート引数の推論を無効にする

std::forward でテンプレート引数の推論が無効になるのはなぜですか?

std::forward 関数は、特定の実装 (VS2010 など) では、identity と呼ばれるテンプレート メタ関数を使用して、テンプレート引数の推論を禁止します。これは、左辺値参照と const 左辺値参照が関係する状況で std::forward の動作を正確に制御するために行われます。 std::forward がテンプレート引数の推論を利用すると、入力引数に基づいてテンプレート パラメータ (T) が推論されます。 タイプ。この動作は、入力引数が lvalue または const lvalue (名前を持つ変数など) の場合に問題になります。このような場合、テンプレート引数の推論により T が左辺値参照または const 左辺値参照として誤って推論され、誤った型キャストが発生します。

次の例を考えてみましょう。

名前付き変数を渡す場合または定数を forward_with_deduction に指定すると、それらが左辺値参照または const 左辺値参照として誤って解釈され、T がそのように推定されてしまいます。その結果、static_cast 操作は、ユニバーサル参照 (T&&) の期待にもかかわらず、型を lvalue 参照または const lvalue 参照に折りたたむことになります。

例:

<code class="cpp">template<typename T>
T&& forward_with_deduction(T&& obj)
{
    return static_cast<T&&>(obj);
}</code>

std::forward の解決

すべての場合において引数を適切にキャストするため、std::forward は ID メタ関数を使用します。 ID は、コンパイラーがテンプレート パラメーターを推測するのを防ぐプレースホールディング型として機能します。その結果、 std::forward は、実際の型に関係なく、入力引数を常にユニバーサル参照として解釈します。
<code class="cpp">int x;
int&& z = std::move(x);

// Incorrectly deduces T to be int& and casts z as int&
forward_with_deduction(z); // calls test(int&) instead of test(int&&)</code>

入力引数をユニバーサル参照にキャストすることにより、std::forward はオブジェクトの完全な転送を可能にします。左辺値または const 左辺値の場合でも。この動作により、転送された引数の型が転送プロセス全体を通じて普遍的な参照のままであることが保証されます。

以上が`std::forward` がテンプレート引数の推論を無効にするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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