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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-11-05 17:45:02571ブラウズ

Why does `std::forward` disable template argument deduction in Visual Studio 2010?

std::forward でのテンプレート引数の推定の無効化

問題ステートメント

Visual Studio 2010 では、std::forward を次のように定義します。テンプレート引数の推論を無効にします。これを意図的に無効にするのはなぜですか?

回答

テンプレート引数の推定により、std::forward で誤った型の決定と誤った動作が発生します。その方法は次のとおりです。

テンプレート引数の推定がない場合

テンプレート引数の推定がない場合、std::forward は次のように定義されます。

<code class="cpp">template<class _Ty> inline
_Ty&amp;&amp; forward(typename identity<_Ty>::type&amp; _Arg) {
    return ((_Ty&amp;&amp;)_Arg);
}</code>

テンプレート引数推定を使用する場合

std::forward がテンプレート引数推定を使用する場合、次のシナリオが発生します。

  • 型 X のオブジェクトへの右辺値参照の場合(例: func() または 7)、テンプレート引数の推定により T が X として正しく決定されます。
  • lvalue または const lvalue (例: 名前を持つオブジェクト) の場合、テンプレート引数の推定により T が誤って左辺値として決定されます。参照または const lvalue 参照。

不正な型決定の影響

完全転送では、std::forward に渡される引数は左辺値です。テンプレート引数の推定が有効になっている場合、推定された型 T は左辺値参照になります。ただし、「完全な転送」は右辺値参照を意味します。

std::forward のキャスト、static_cast(arg) は、元の引数が右辺値である場合でも、常に左辺値参照に折りたたまれます。これにより、正しくキャストされず、完全な転送メカニズムが誤動作する可能性があります。

次のコードは、テンプレート引数の推定に関する問題を示しています。

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

int main() {
    int x;
    int& y = x;
    int&& z = std::move(x);

    forward_with_deduction(7); // Correctly calls forward(int&&)
    forward_with_deduction(y); // Incorrectly calls forward(int&)

    std::forward<int&>(y); // Correctly calls forward(int&)
}</code>

結論

std::forward でのテンプレート引数の推定を無効にすることは、完全転送が正しく機能するために重要です。これにより、誤った型決定が防止され、右辺値参照が右辺値参照として正しく転送されることが保証されます。

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

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