问题陈述
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 中禁用模板参数推导对于完美转发的正确运行至关重要。它可以防止错误的类型确定,并确保右值引用作为右值引用正确转发。
以上是为什么'std::forward”在 Visual Studio 2010 中禁用模板参数推导?的详细内容。更多信息请关注PHP中文网其他相关文章!