面试中常被问到左/右值引用

Posted AllenSquirrel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中常被问到左/右值引用相关的知识,希望对你有一定的参考价值。

左/右值引用

  • 概念:

  1. 左值:能对表达式取地址,或匿名对象/遍历。可能出现在=左边,表达式结束后依然存在的持久对象
  2. 右值:不能对表达式取地址,或匿名对象。只能出现在=右边,表达式结束后就不在存在的对象(一般右值为常量,临时变量,匿名对象,局部变量等)
  • 左/右值引用区别:

  1. 左值可以寻址,右值不可以
  2. 左值可以被赋值,右值不可以被赋值,但可以给左值赋值
  3. 左值可变,右值不可变
  4. 普通引用只能引用左值,不能引用右值
  5. const引用既可以引用左值,又可以引用右值
  6. c++11右值引用只能引用右值,不能直接引用左值

因此关于左值与右值的区分不是很好区分,一般认为:
1. 普通类型的变量,因为有名字,可以取地址,都认为是左值。
2. const修饰的常量,不可修改,只读类型的,理论应该按照右值对待,但因为其可以取地址(如果只是const类型常量的定义,编译器不给其开辟空间,如果对该常量取地址时,编译器才为其开辟空间),C++11认为其是左值。
3. 如果表达式的运行结果是一个临时变量或者对象,认为是右值。
4. 如果表达式运行结果或单个变量是一个引用则认为是左值。

  • 目的&作用:

  1. 右值引用是C++11新特性,实现转移语义和精确传递
  2. 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率
  3. 能够更加简洁明确定义泛型函数

以上是关于面试中常被问到左/右值引用的主要内容,如果未能解决你的问题,请参考以下文章

[c++11]右值引用移动语义和完美转发

通用引用的语法

❥关于C++之右值引用&移动语义┇移动构造&移动复制

将右值引用绑定到(自动生成的)左值

[转][c++11]我理解的右值引用移动语义和完美转发

cpp►C++11右值引用移动语义移动构造函数移动赋值运算符