【发布时间】:2012-04-17 18:30:14
【问题描述】:
C++03 5.1 主要表达式 §2 说:
文字是主要的表达式。它的类型取决于它的形式(2.13)。字符串文字是左值;所有其他文字都是右值。
同样,C99 6.5.1 §4 说:
字符串文字是主要表达式。它是一个左值,其类型详见 6.4.5。
这背后的原理是什么?
据我了解,字符串文字是对象,而所有其他文字都不是。而左值总是指一个对象。
但是问题是为什么字符串文字是对象而所有其他文字都不是?在我看来,这个理由更像是鸡蛋或鸡肉的问题。
我知道这个问题的答案可能与硬件架构有关,而不是 C/C++ 作为编程语言,但我想听听同样的。
【问题讨论】:
-
左值不是对象。左值是可以出现在赋值左侧的值,例如变量、结构成员和数组元素查找。 (L = 左。)
-
@duskwuff:委员会要求不同。根据 6.3.2.1,“左值是具有对象类型或除 void 之外的不完整类型的表达式;如果左值在评估时未指定对象,则行为未定义。”根据该引文中引用的脚注 (53),左值应被视为“对象定位器值”。
-
@JohnCalsbeek C++11 '修复',例如
alias<T[N]> {}现在可以了。如果arr在U的类定义中声明为这样,U {}.arr也是数组类型的右值。 -
顺便说一句,左值的更好近似是“
&运算符的语法有效操作数”。我怀疑定义实际上等同于标准的定义,除非我遗漏了什么...... -
更新:这只是近似值。寄存器存储类对象作为
&的操作数无效,但它们是左值。另外,我不清楚为什么将&应用于指定为对象类型的函数的返回值(可能)是无效的......
标签: c++ c literals string-literals