3.10 左值和右值
1 每个表达式要么是左值
或右值。
2 左值指的是一个对象或
功能。一些右值
表达式——类的或
cvqualified 类类型——也可以参考
对象.47)
3 [注意:一些内置运算符和
函数调用产生左值。
[示例:如果 E 是
指针类型,那么 *E 是一个左值
表示对象或
E 指向的函数。作为另一个
例如,函数 int& f();产量
一个左值,所以调用 f() 是一个
左值表达式。 ]
- [注意:一些内置运算符需要左值操作数。 [示例:内置
赋值运算符都期望他们的
左手操作数是左值。 ]
其他内置运算符产生右值,
有些人期待他们。 [例如:
一元和二元 + 运算符期望
右值参数和产生右值
结果。 ] 每个人的讨论
第 5 条中的内置运算符表示
它是否需要左值操作数和
它是否产生左值。 ]
5 调用函数的结果
不返回引用的是
右值。用户定义的运算符是
功能,以及是否此类运营商
期望或产量左值已确定
通过它们的参数和返回类型。
6 一个表达式,它包含一个
由演员表产生的临时对象
到非引用类型是一个右值
(这包括显式创建
使用功能符号的对象
(5.2.3))。
7 每当左值出现在需要右值的上下文中时,
左值转换为右值;
请参阅 4.1、4.2 和 4.3。
8 参考讨论
8.5.3 中的初始化和
12.2 中的临时人员表示
左值和右值的行为
其他重要的上下文。
9 类右值可以有 cvqualified
类型;非类右值总是有
cvunqualified 类型。右值应
总是有完整的类型或 void
类型;除了这些类型,
左值也可以不完整
类型。
10 对象的左值是
为了修改
除了类的右值之外的对象
类型也可以用来修改它的
特定情况下的参照物。
[示例:调用的成员函数
对象(9.3)可以修改对象。
]
11 函数不能修改,但是
指向函数的指针可以是
可修改。
12 指向不完整类型的指针可以
是可修改的。在某个时刻
当指向的类型是
完成,对象所在的
指针点也可以修改。
13 constqualified 的所指对象
不得修改表达式
(通过那个表达式),除了
如果它是类类型并且有一个
可变组件,该组件可以
被修改(7.1.5.1)。
14 如果一个表达式可以用来
修改它所指的对象,
该表达式称为可修改的。一种
试图修改一个程序
通过不可修改的左值对象
或右值表达式格式不正确。
15 如果程序试图访问
通过一个对象的存储值
不是其中一个的左值
以下类型的行为是
undefined48): — 的动态类型
对象,——一个 cvqualified 版本
对象的动态类型——a
有符号或无符号的类型
动态类型对应的类型
对象的,- 一种类型,即
有符号或无符号类型对应
到 cvqualified 版本的
对象的动态类型,-
聚合或联合类型,包括
上述类型之一
它的成员(包括,递归地,一个
子聚合或包含的成员
union), — 一个类型是(可能
cvqualified) 的基类类型
对象的动态类型,——一个字符
或无符号字符类型。