我有以下代码段:
int i[] = {42, i[0]};
是否允许这种初始化或导致不确定的行为?
三个主要的编译器(gcc,clang和msvc)为42
给了i[1]
。因此看起来合法,但我希望从这种情况的标准中得到引用。
答案 0 :(得分:11)
是的,它定义明确。
int i[] = {42, i[0]};
这是 aggregate 1 初始化 2 。聚合初始化遵循以下规则:
[dcl.init.aggr]/6
按元素顺序评估聚合元素的初始化。也就是说,与给定元素相关联的所有值计算和副作用都将按顺序排列在其后的任何元素的计算之前。