C89或C++ 03是否定义了严格的别名规则?

Bil*_*eal 5 c c++

我已经看到几个断言,C89和C++ 03定义了严格的别名规则.但是,我无法在标准中找到该特定位.我的理解是在C99中添加了严格的别名规则.

caf*_*caf 5

本文载于C89,§3.3表达式:

对象的存储值只能由具有以下类型之一的左值访问:

  • 声明的对象类型,

  • 声明的对象类型的限定版本,


  • 声明的对象类型对应的有符号或无符号类型的类型,


  • 与已声明的对象类型的限定版本对应的有符号或无符号类型的类型,

  • 聚合或联合类型,包括
    其成员中的上述类型之一(包括递归地,
    子聚合或包含联合的成员),或者

  • 一个字符类型.

违反"shall"约束会导致未定义的行为,因此可以从此文本派生一组允许的别名规则.


Ste*_*sop 5

C89中的3.3,C++ 03中的3.10/15.

两者都有一个脚注,字样效果,"此列表的目的是指示何时对象可能会或可能不会出现别名".


Xeo*_*Xeo 5

C++ 03标准具有以下内容§3.10 [basic.lval] p15:

如果程序试图通过不同于以下类型之一的左值来访问对象的存储值,则行为未定义48):
- 对象的动态类型, - 动态类型的
cv限定版本object,
- 对应于对象的动态类型的有符号或无符号类型的类型,
- 对应于对象的动态类型的cv限定版本的有符号或无符号类型的类型,
- 聚合或union类型,包括其成员中的上述类型之一(包括递归地,子聚合或包含联合的成员),
- 一种类型,是对象的动态类型的(可能是cv限定的)基类类型,
- char或unsigned char类型.

脚注:

48)此列表的目的是指定对象可能或可能不具有别名的情况.

该站点还列出了其他标准中的部分.