左值中的命名右值引用,但它是一个只能绑定到右值的左值,因此:
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!
x
和y
都是命名的右值引用,所以都是左值,为什么我可以在这里绑定一个左值到一个右值引用,为什么我可以在这里绑定,但是不能像第一个代码片段(int&& y = x;
)那样在一行中绑定?
2条答案
按热度按时间w1e3prcc1#
x
和y
是类型为右值引用的左值。这些引用绑定到临时int
,临时int
的生存期将延长以匹配引用的生存期。表达式
y = x
不重新绑定y
的引用。这是不可能的,引用不能被重新绑定。相反,它读取由x
引用的int
的 value,然后将该值赋给由y
引用的int
。reference就是一个reference,period. reference的 type 决定了它是引用一个现有的左值变量还是临时的右值变量.你不能引用一个reference,这在C++中是不存在的,这就是为什么下面的代码:
无法编译。
但是,这个代码:
编译,并按预期工作(即,赋值给
y
会更改x
引用的int
的值)。Online Demo
bq3bfh9z2#
在第二个例子中,你没有绑定任何东西,这只是赋值,
operator=
。