引用类型与其值类别之间的差异
我将很高兴为这个问题提供帮助。
Widget&& var1 = someWidget; // here, “&&” means rvalue reference
auto&& var2 = var1; // here, “&&” does not mean rvalue reference
为什么
auto&& var2
不代表右值参考?
var2
是通用引用,因为涉及类型推导。因此,var2
将根据其初始化方式成为左值引用或右值引用(var2
始终是引用)。
auto
中的auto&& var2 = var1;
推导为Widget&
,因为var1
是一个左值(即var1
是一个命名对象,而您尚未对其应用std::move()
)。然后,由于Widget& &&
,Widget&
产生reference collapsing。总而言之,该语句:
auto&& var2 = var1;
类型推导后变成:
Widget& var2 = var1;
所以var2
实际上是一个左值引用。
如果希望var2
作为右值引用,则可以将std::move()
应用于初始化对象:
auto&& var2 = std::move(var1);
扣除类型后,结果为:
Widget&& var2 = var1;
var2
在这种情况下是右值引用。