在C ++标准中它在哪里讨论别名?我看着ToC,没有提到“别名”这个词。我试着查看一个定义规则(3.2),搜索'别名'没有结果。我可能会感到茫然。我正在寻找内存别名
答案 0 :(得分:10)
别名主要在§3.10[basic.lval] / 10:
中讨论如果程序试图通过除了其中一个之外的glvalue访问对象的存储值 以下类型的行为未定义: 52
- 对象的动态类型,
- 对象的动态类型的cv限定版本,
- 与对象的动态类型相似的类型(如4.4中所定义)
- 与对象的动态类型对应的有符号或无符号类型的类型
- 对应于动态类型的cv限定版本的有符号或无符号类型 对象,
- 聚合或联合类型,包括其元素中的上述类型之一或非 静态数据成员(包括递归地,子集合的元素或非静态数据成员) 或包含联盟),
- 一种类型,它是对象动态类型的(可能是cv限定的)基类类型,
char
或unsigned char
类型。52)此列表的目的是指定对象可能存在或不存在别名的情况。
所以,例如,
int x = 1;
*(char*)(&x); // (implementation-)defined
*(unsigned*)(&x); // (implementation-)defined
*(float*)(&x); // undefined
以下提及也可能很有趣。
§5.17[expr.ass] / 8
如果存储在对象中的值是从另一个以任何方式重叠存储的对象访问的 第一个对象,然后重叠应该是精确的,两个对象应该是相同的类型,否则 行为未定义。 [注意:此限制适用于左侧和右侧之间的关系 分配操作;它不是关于如何将赋值目标置于别名中的陈述 一般。见3.10。 - 结束记录]
§17.6.4.9[res.on.arguments] / 1 pt 3:
如果函数参数绑定到右值引用参数,则实现可以假设 此参数是对此参数的唯一引用。 ...... [The 实现可以自由地优化掉参数检查,如果参数是可能需要的 左值。]
§26.6.2[valarray.syn] / 2:
valarray
数组类被定义为没有某些形式的别名,因此允许进行操作 这些类要优化。
以及<valarray>
的其余部分也讨论了如何实现类以避免数据别名。