首页 > 后端开发 > C++ > 为什么'std::forward”在 Visual Studio 2010 中禁用模板参数推导?

为什么'std::forward”在 Visual Studio 2010 中禁用模板参数推导?

Barbara Streisand
发布: 2024-11-05 17:45:02
原创
598 人浏览过

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。
  • 对于左值或 const 左值(例如,具有名称的对象),模板参数推导将错误地将 T 确定为左值引用或 const 左值引用。

类型确定不正确的影响

在完美转发中,传递给 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 中禁用模板参数推导对于完美转发的正确运行至关重要。它可以防止错误的类型确定,并确保右值引用作为右值引用正确转发。

以上是为什么'std::forward”在 Visual Studio 2010 中禁用模板参数推导?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板