在 N4606 的第 8.6.4p4 段中,我们有:
在花括号初始化列表的初始化列表中,初始化子句 , ...,按照它们出现的顺序进行评估。也就是说,与给定初始化子句相关联的每个值计算和副作用在初始化器列表的逗号分隔列表中与任何初始化子句相关联的每个值计算和副作用之前进行排序。
在这个程序中:
#include <algorithm>
#include <numeric>
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
int i = 0;
int a[4] = { ++i, ++i, ++i, // These are OK.
accumulate(begin(a), end(a)-1, 0, plus<int>()) // Is this well-defined?
};
copy(begin(a), end(a), ostream_iterator<int>(cout, " "));
}
很明显,accumulate
在表达式之后计算++i
,并且副作用++i
是有序且明确定义的。但是数组元素的初始化是否也是初始化子句++i
的副作用?是读出值 1、2 和 3,还是可能访问未初始化的值?accumulate