首页 >后端开发 >C++ >为什么 `T&&` 的行为并不总是像真正的右值引用?

为什么 `T&&` 的行为并不总是像真正的右值引用?

Linda Hamilton
Linda Hamilton原创
2024-11-30 06:21:15411浏览

Why Doesn't `T&&` Always Behave Like a True Rvalue Reference?

为什么 T&& 的行为不像右值引用?

使用 void f(T&&) 和 void f(T& 等函数重载时),令人惊讶的是,当传入 T&& 时会调用 f(T&),尽管反之则不然。这是由于 C 中右值引用的行为造成的。

与直觉相反,T&& 不仅仅是一个右值引用。它是右值引用类型,这意味着它只能绑定到右值,但在其他方面的行为类似于右值引用类型的左值。这种绑定行为确保没有名称的对象和即将失去名称的对象自动被视为右值。

但是,由于 T&& 有名称(即 t),因此它被视为左值,因此调用 f( T&) 过载。使用 f(static_cast(t)) 将 t 静态转换为 T&&&&&>(t)) 是调用右值引用重载 f(T&&) 所必需的。

总而言之,管理此行为的 C 规则是:

  • 当从函数返回命名值、值没有名称或函数显式返回右值时,会发生隐式移动引用。
  • 只有右值引用和 const& 可以绑定到右值。
  • 直接绑定到构造函数外部的引用时,会发生临时值的引用生命周期扩展,并且适用于右值引用和 const&。
  • T&& 并不总是右值引用;根据 T 的类型,它可能会折叠为 X&、X const& 或 X const&&。
  • T&& 可以在类型推导上下文中充当“转发引用”,根据参数的类型推导 T。

以上是为什么 `T&&` 的行为并不总是像真正的右值引用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn