例如一个字符串文字:“Hello, world!” 不能出现在赋值运算符的左边。那怎么可能是左可采表达式呢?
"WTF" = "Hello, world!"; // ошибка компиляции
l值:
- 直接指定对象的表达式,在 const 限定的情况下不可修改。例如变量名、函数参数等。
- 引用类型表达式。在 const 限定的情况下不可修改。特别是调用通过引用返回对象的函数的结果;由引用变量名组成的表达式;到引用类型的转换操作等。
- 内置解引用操作(*)的结果是指定类型的左值;在 const 限定的情况下不可修改。
- 内置前缀运算的结果++、--。
- 函数名称。
- 数组的名称。
- 字符串文字。
r 值:
- 表示临时对象的表达式。特别是,调用函数的结果不是通过引用返回对象;内置操作 +、- 的结果。> *、/等;显式创建临时变量 int() 或 C();转换为非引用类型等
- 内置地址操作 (&) 的结果是指针类型的右值。
- 内置后缀操作 ++、-- 的结果。
- 字符串以外的文字(例如数字文字)。
- 枚举常量。
C++ 中的字符串字面量是严格意义上的常量,不能单独参与赋值。此外,2.14.5.12 说:尝试修改字符串文字的效果是未定义的。
此外,实际上,这是一个数组,数组同样不以任何方式参与赋值。
3.10.9 说“如果表达式可用于修改它所引用的对象,则该表达式称为可修改的。试图通过不可修改的左值或右值表达式修改对象的程序是病式的。”
我们的左值显然是不可修改的。
但是,左值的概念与您赋予的含义略有不同。
左值(历史上之所以这样称呼,是因为左值可以出现在赋值表达式的左侧)指定一个函数或一个对象。
这里的主要问题不是历史上它们可能位于赋值表达式的左侧,而是这是内存中的一个对象,您可以从中获取地址。并且很有可能得到字符串文字的地址,从这个意义上说它是一个左值。
我想是的......(c)维尼
左值并不意味着这样的表达式总是可以出现在赋值运算符的左边。例如,假设您有
const int meConst = 5;,meConst在表达式meConst = 6;中是一个左值,但该示例仍然无法组装,因为 无法更改const int。与字符串文字相同:是 - 它是一个左值,否 - 它不能被修改。以及来自 C11[6.3.2.1] 的一小段但相关的引述: