問題ステートメント
Visual Studio 2010 では、std::forward を次のように定義します。テンプレート引数の推論を無効にします。これを意図的に無効にするのはなぜですか?
回答
テンプレート引数の推定により、std::forward で誤った型の決定と誤った動作が発生します。その方法は次のとおりです。
テンプレート引数の推定がない場合
テンプレート引数の推定がない場合、std::forward は次のように定義されます。
<code class="cpp">template<class _Ty> inline _Ty&& forward(typename identity<_Ty>::type& _Arg) { return ((_Ty&&)_Arg); }</code>
テンプレート引数推定を使用する場合
std::forward がテンプレート引数推定を使用する場合、次のシナリオが発生します。
不正な型決定の影響
完全転送では、std::forward に渡される引数は左辺値です。テンプレート引数の推定が有効になっている場合、推定された型 T は左辺値参照になります。ただし、「完全な転送」は右辺値参照を意味します。
std::forward のキャスト、static_cast
例
次のコードは、テンプレート引数の推定に関する問題を示しています。
<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 サイトの他の関連記事を参照してください。