值类别 (value category)

值类别 (value category)#

左值

可以概括认为是已经存在了的对象, 例如:

左值实际存在, 这意味着它被存储在某个位置, 则可以通过 & 获取它的地址:

1int value;
2std::cout << &value;  // 获取地址并输出
右值

除了左值以外的值, 例如:

  • 临时对象 (int function() 的返回值).

  • 其他字面值 (42, 它即写即用, 不会被存储).

警告

这里的解释是通用解释, 实际表现可能由于编译器、编译器版本、编译选项、标准版本等存在差异.

交叉内容#

值类别与引用#

T& 只能引用左值即 "已经存在的对象", 因此不进行会产生临时对象的隐式类型转换.

1int value      = 0;
2int& reference = value;

T const& 既能引用左值又能引用右值.

既然能引用右值即临时值, 则允许在引用时发生隐式类型转换; 但这将会引用转换产生的临时对象而不是原本的对象.

1double value         = 0;
2int const& reference = value;  // 正确: T const& 能够引用临时对象
3
4value = 1;
5std::cout << reference;  // 输出 0

相关解答#