繁体   English   中英

为什么 T&& 参数保留参数的常量和左值/右值属性,而 T& 没有

[英]Why does a T&& parameter preserves the constness and lvalue/rvalue property of the argument while a T& doesn't

我刚刚在 C++ Primer 中读过这个:

作为对模板类型参数(即 T&&)的右值引用的函数参数保留其对应参数的常量性和左值/右值属性。

但我不明白为什么 T&& 参数有这个功能,而 T& 没有。

这背后的 C++ 逻辑是什么?

因为如果T是函数模板参数,则T&是对T的非常量引用,而T&&如果用作函数参数的类型,则称为转发引用。 其他T&& ,例如template<typename T> void foo(std::vector<T&&> x)实际上是一个不能推导出 const 的 r-value 引用(不是 const r-value 引用非常有用)。

因为我们想自动区分以下情况:

  • const int x = 5; foo(x);
  • int x = 5; foo(std::move(x));
  • int x = 5; foo(x);
  • foo(int{5})

在保留单个template<typename T> foo(T&& x)定义的同时,转发引用被赋予推断const的能力。

至于为什么T&不能推断const ,它可能从来都不是这个功能的意图。 它实际上是作为对泛型类型的非常量引用。 这会使x.non_const_member()有时无法编译。

是的, T&&也会发生这种情况,但这里的意图正是将传递给我们的类型转发到其他地方,而不一定要自己修改对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM