C++ 中的左值和右值

左值和右值在 C++11 之后变得十分重要,它是理解 move/forward 等新语义的基础。

不能简单地从字面意义来理解,左值就是赋值号 “=” 左边的值, 右值就是赋值号 “=” 右边的值。

  1. 左值可以被寻址(addressable),右值不可以被寻址。下面示例中 &x, &y 正确, &(x+y) 错误。
int x = 3, y = 5;

&x, &y;
&(x+y);

2. 左值可以出现在赋值号的右边作为右值来使用,只有可修改的左值(modifiable)可以被赋值,也就是可以出现在赋值号左边。

例如 x = y;

数组名是不可修改的左值。下面代码中数组名 arr 不可被修改,所以 arr = &x 错误。

int arr[10] = {0};
arr = &x;

右值只能出现在赋值号右边, 3 = 5, x+3 = 10, 这样的语句没有意义也无法编译通过。

3. 加了 const 修饰符的左值不能被修改,所有右值都不可修改。下面代码中的 pi = 3.1415926535897932384; 非法,无法编译通过。

const double pi = 3.141592653589;
pi = 3.1415926535897932384;

Leave a Reply

Your email address will not be published. Required fields are marked *