标准在哪里谈论混叠?

5 c++ standards language-lawyer c++11

在C++标准中它在哪里讨论别名?我看着ToC,没有提到"别名"这个词.我试着查看一个定义规则(3.2),搜索'别名'没有结果.我可能会感到茫然.我正在寻找内存别名

ken*_*ytm 10

别名主要在§3.10[basic.lval]/10中讨论:

如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:52

  • 对象的动态类型,
  • 一个cv限定版本的动态类型的对象,
  • 与对象的动态类型类似的类型(如4.4中所定义),
  • 与对象的动态类型对应的有符号或无符号类型的类型,
  • 一种类型,是有符号或无符号类型,对应于对象动态类型的cv限定版本,
  • 聚合或联合类型,包括其元素或非静态数据成员中的上述类型之一(递归地,包括子聚合或包含联合的元素或非静态数据成员),
  • 一个类型,它是对象动态类型的(可能是cv限定的)基类类型,
  • a charunsigned char类型.

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

所以,例如,

int x = 1;
*(char*)(&x);     // (implementation-)defined
*(unsigned*)(&x); // (implementation-)defined
*(float*)(&x);    // undefined
Run Code Online (Sandbox Code Playgroud)

以下提及也可能很有趣.

§5.17[expr.ass]/8

如果存储在对象中的值是从另一个以第一个对象的存储方式重叠的对象访问的,则重叠应该是精确的,并且两个对象应具有相同的类型,否则行为是不确定的.[ 注意:此限制适用于分配操作的左侧和右侧之间的关系; 它不是关于如何将赋值目标一般化为别名的声明.见3.10.- 结束说明 ]

§17.6.4.9[res.on.arguments]/1 pt 3:

如果函数参数绑定到右值引用参数,则实现可以假定此参数是对此参数的唯一引用.... [实现可以自由地优化别名检查,如果参数是左值,则可能需要这些检查.

§26.6.2[valarray.syn]/2:

valarray数组类被定义为自由的混叠的某些形式中,因此允许这些类的操作进行优化.

其余的<valarray>还讨论了如何实现类以避免数据别名.