9

我有以下代码片段:

int i[] = {42, i[0]};

是否允许这样的初始化或导致未定义的行为?

三个主要编译器(gcc、clang、msvc)为我42提供了i[1]. 因此看起来是合法的,但我想从这个案例的标准中看到一个引用。

4

1 回答 1

11

是的,它定义明确。

int i[] = {42, i[0]};

这是一个聚合1初始化2。聚合初始化遵循以下规则:

[dcl.init.aggr]/6

聚合元素的初始化按元素顺序进行评估。也就是说,与给定元素相关的所有值计算和副作用都按顺序排列在其后面的任何元素之前。


1) http://eel.is/c++draft/dcl.init.aggr#1

2) http://eel.is/c++draft/dcl.init.aggr#3

于 2018-08-13T09:11:08.673 回答