关于C++中左值、右值及右值引用绑定规则的技术问询
关于C++中左值、右值及右值引用绑定规则的技术问询
兄弟,我太懂这种卡壳的感觉了!这个右值引用的绑定规则确实容易绕晕人,我当年刚学的时候也踩过不少坑,今天就给你掰扯明白。
先看你提到的第一个错误例子:
int x; int&& y = x; // Error: cannot bind rvalue reference to lvalue
这里x是个左值——简单说就是你能取地址的变量,而右值引用(&&)的本职工作就是绑定到右值上(比如临时值、字面量这种没法取地址的东西),所以编译器直接报错,这个逻辑没问题对吧?
那再看你疑惑的第二个例子:
int&& y = 5; int&& z = y;
这里为啥y不能直接绑定给z呢?关键点来了:右值引用变量本身是个左值!
你没看错,y虽然是个右值引用类型,但当你直接用它的名字的时候,它就变成了左值——因为它是一个有名字的变量,你可以对它取地址(比如&y是合法的)。而z是右值引用,它只能绑定右值,所以直接写int&& z = y同样会报和第一个例子一样的错误:不能把左值绑定到右值引用上。
那要是想让y能绑定给z怎么办?用std::move()把它转换成右值就行:
int&& y = 5; int&& z = std::move(y);
std::move()的作用就是把左值强制转换成右值引用类型,这样就符合绑定规则了。
最后给你划个核心重点:
- 右值引用(
T&&)只能绑定到右值(临时对象、字面量、std::move()转换后的左值) - 任何有名字的变量,不管它是左值引用还是右值引用类型,本身都是左值
备注:内容来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

