我已经看到几个断言,C89和C++ 03定义了严格的别名规则.但是,我无法在标准中找到该特定位.我的理解是在C99中添加了严格的别名规则.
本文载于C89,§3.3表达式:
对象的存储值只能由具有以下类型之一的左值访问:
声明的对象类型,
声明的对象类型的限定版本,
与
声明的对象类型对应的有符号或无符号类型的类型,
与已声明的对象类型的限定版本对应的有符号或无符号类型的类型,聚合或联合类型,包括
其成员中的上述类型之一(包括递归地,
子聚合或包含联合的成员),或者一个字符类型.
违反"shall"约束会导致未定义的行为,因此可以从此文本派生一组允许的别名规则.
C++ 03标准具有以下内容§3.10 [basic.lval] p15:
如果程序试图通过不同于以下类型之一的左值来访问对象的存储值,则行为未定义48):
- 对象的动态类型, - 动态类型的
cv限定版本object,
- 对应于对象的动态类型的有符号或无符号类型的类型,
- 对应于对象的动态类型的cv限定版本的有符号或无符号类型的类型,
- 聚合或union类型,包括其成员中的上述类型之一(包括递归地,子聚合或包含联合的成员),
- 一种类型,是对象的动态类型的(可能是cv限定的)基类类型,
- char或unsigned char类型.
脚注:
48)此列表的目的是指定对象可能或可能不具有别名的情况.
该站点还列出了其他标准中的部分.
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |