c++ 命名r值参考绑定与赋值

xmd2e60i  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(108)

左值中的命名右值引用,但它是一个只能绑定到右值的左值,因此:

int&& x = 5; // Ok because 5 is an rvalue
int&& y = x; // Error: You cannot bind an lvalue to an rvalue reference

好吧,那么为什么我可以在将引用y绑定到一个右值之后赋值呢?

int&& x = 5;
int&& y = 8;
y = x;  // Ok! This compiles!

xy都是命名的右值引用,所以都是左值,为什么我可以在这里绑定一个左值到一个右值引用,为什么我可以在这里绑定,但是不能像第一个代码片段(int&& y = x;)那样在一行中绑定?

w1e3prcc

w1e3prcc1#

xy是类型为右值引用的左值。这些引用绑定到临时int,临时int的生存期将延长以匹配引用的生存期。
表达式y = x不重新绑定y的引用。这是不可能的,引用不能被重新绑定。相反,它读取由x引用的intvalue,然后将该值赋给由y引用的int
reference就是一个reference,period. reference的 type 决定了它是引用一个现有的左值变量还是临时的右值变量.你不能引用一个reference,这在C++中是不存在的,这就是为什么下面的代码:

int&& x = 5;
int&& y = x;

无法编译。
但是,这个代码:

int&& x = 5;
int&& y = std::move(x);
y = 7;

编译,并按预期工作(即,赋值给y会更改x引用的int的值)。
Online Demo

bq3bfh9z

bq3bfh9z2#

在第二个例子中,你没有绑定任何东西,这只是赋值,operator=

相关问题