03-左值右值傻傻分不清

目录

      • 前言
      • 分类
      • 右值作为函数形参
      • 生命周期
      • 引用坍缩
      • Q&A
      • 总结

前言

C++11比起C++98一个重要的提升就是引入了移动语义。这一个重要的提升为后面很多容器的优化都奠定了基础。但是引入移动语义,也带来了另外一个左值右值的概念。从字面上可以理解为在等号左边的就是左值,在等号右边的就是右值。但是至于这个左值和右值各自又有什么性质,有哪些特点这都不得而知。今天我们就来掰扯掰扯这个左值和右值的问题。

分类

03-左值右值傻傻分不清_第1张图片
在这里面有三个子概念,分别是广义左值,有名右值,纯右值。下面我们就来一一剖析一下吧。

  • 无名左值:有标识符,可以取地址的表达式;常见的有,变量,函数,数据成员,返回引用左值的表达式,字符串字面量。比如:int x;++x;x = 1;cout << "";"hello world"
  • 有名右值:有标识符,但是不可以取地址的表达式;通常是由move()函数产生。比如:move(x);
  • 纯右值:没有标识符,不可以取地址的表达式;通常都是一些临时变量,常见的有返回非引用类型的表达式,除字符串字面量之外的字面量。比如:x++;x + 1;42;true;
    这里需要测试一个内容就是x++++x,一个是左值,一个是右值。
    03-左值右值傻傻分不清_第2张图片
    这也可以看出来这个x++的确是一个右值。
    对于左值和右值的判断应该有一个大概的了解了吧,能够取地址的都是左值,不能取地址的都是右值。因为要对一个值进行赋值操作,如果连变量的存储位置都不知道,怎么进行内存操作呢?

右值作为函数形参

我们来看下面这个例子:

#

你可能感兴趣的:(现代C++,c++,编程语言)