1. 什么是右值?
有名称,可以取地址的值,是左值。
没有名称,不能取地址的值,就是右值,另外类似函数返回值这种临时变量,定义为将亡值,也是右值。
c++11中,所有的值,必属于左值,将亡值,和纯右值。
2. 左值引用,右值引用
1 | int main() { |
左值引用,只能绑定左值
常左值引用,可以绑定常量左值,右值,非常量左值和右值
右值引用,只能绑定非常量右值
常右值引用,可以绑定常量右值,非常量右值
3. 讨论右值引用,要注意排除返回值优化
如果关闭返回值优化,可以参考
https://www.yhspy.com/2019/09/01/C-%E7%BC%96%E8%AF%91%E5%99%A8%E4%BC%98%E5%8C%96%E4%B9%8B-RVO-%E4%B8%8E-NRVO
1 | Person GetPerson(){ |
1 | Person&& GetPerson(){ |
4. 函数返回值,如果没有写左值引用,就是临时变量属于右值
1 | Person GetPerson(){ |
理解上面person1和person2的区别,person1是根据临时变量构造了一个新的对象
person2是直接对临时变量的右值引用
注意
1 | const Person& GetPerson1(){ |
上面两种写法都是错误的,返回的是临时变量的引用,可以编译通过,但是有警告
Returning reference to local temporary object