面试中常被问到左/右值引用
Posted AllenSquirrel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中常被问到左/右值引用相关的知识,希望对你有一定的参考价值。
左/右值引用
-
概念:
- 左值:能对表达式取地址,或匿名对象/遍历。可能出现在=左边,表达式结束后依然存在的持久对象
- 右值:不能对表达式取地址,或匿名对象。只能出现在=右边,表达式结束后就不在存在的对象(一般右值为常量,临时变量,匿名对象,局部变量等)
-
左/右值引用区别:
- 左值可以寻址,右值不可以
- 左值可以被赋值,右值不可以被赋值,但可以给左值赋值
- 左值可变,右值不可变
- 普通引用只能引用左值,不能引用右值
- const引用既可以引用左值,又可以引用右值
- c++11右值引用只能引用右值,不能直接引用左值
因此关于左值与右值的区分不是很好区分,一般认为:
1. 普通类型的变量,因为有名字,可以取地址,都认为是左值。
2. const修饰的常量,不可修改,只读类型的,理论应该按照右值对待,但因为其可以取地址(如果只是const类型常量的定义,编译器不给其开辟空间,如果对该常量取地址时,编译器才为其开辟空间),C++11认为其是左值。
3. 如果表达式的运行结果是一个临时变量或者对象,认为是右值。
4. 如果表达式运行结果或单个变量是一个引用则认为是左值。
-
目的&作用:
- 右值引用是C++11新特性,实现转移语义和精确传递
- 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率
- 能够更加简洁明确定义泛型函数
以上是关于面试中常被问到左/右值引用的主要内容,如果未能解决你的问题,请参考以下文章