1. 背景
左值右值其实是各种语言普遍存在一种语法,只是在C++11中变得比较突出,原因是C++11中增加了一些与左值右值相关的语法,例如左值引用(&
)、右值引用(&&
)、以及move
和forward
。下面做一些浅显易懂的介绍。
2. 概念
首先,了解一下什么是左值与右值。
- 右值:只能在
=
右边的值。 - 左值:可以在
=
左边的值。
就是这么简单,但是注意黑体字的区别,它暗含了下面的含义:
- 右值不能在
=
左边。 - 左值也可以在
=
右边。
那么,接下来说一下C++11,那些是左值,那些是右值?
概念 | 说明 | 举例 |
---|---|---|
左值 | 有名称的值/对象 | 所有变量(包括const变量) |
右值 | 无名临时值/对象 | 通常是字面量(数字、字符串)、临时对象或者表达式。 |
举例
int n = 1;
string s = "Hello World";
const float PI = 3.1415926535;
const float PI_2 = PI * 2;
string t = string("abc");
上面这些n
,s
,PI
,PI_2
、t
都是左值,1
、"Hello World"
、3.1415926535
、PI * 2
,string("abc")
这些都是右值。
说明
字符串字面量的右值身份存在争议,因为它可以取地址,例如:&("abc")
,但它是货真价实的右值。
3. 区别
上面对左值与右值做了表面的区分,下面来看一下二者深层次的区别。
No. | 分类 | 左值 | 右值 |
---|---|---|---|
1 | 生存周期 | 语句外(语句结束还存在) | 语句内(语句结束就不存在了) |
3 | 操作 | 可以取地址 | 不可以取地址(字符串字面量除外) |
问题
上面提到了变量、常量、字面量、对象、表达式作为左值右值的情况,那么函数是左值还是右值?
网友评论