C++左值、右值


值类别

在 C++11之后,C++根据

  • 被标识:可通过不同标识符指代同一实体。(对象/内存)
  • 可移动:可作为移动语义函数的参数,例如移动构造,移动赋值。

将值分为以下类别:

  • 泛左值:被标识
    • 左值:被标识且不可移动
    • 将亡值:被标识可移动
  • 右值:可移动
    • 将亡值:被标识可移动
    • 纯右值:不被标识且可移动

左值

int a = 1;

a是一个左值,左值是关联了名称的内存位置。

纯右值

int a = 1;

1是一个纯右值,纯右值是指不被标识且可移动的值,例如字面量。

将亡值

using std::string;
string get()
{
	string ret = "abc";
	return ret;
}

string str = get();

get() 函数调用会产生一个临时变量赋给str,这个临时变量是将亡值,此时的赋值是移动语义(c++11之前是复制语义)。

C++