逗号(,
)是std::initializer_list
中的序列点吗?
示例:是否是UB:
#include <vector>
int main()
{
auto nums = []
{
static unsigned x = 2;
return ( x++ % 2 ) + 1;
};
std::vector< int > v{ nums(), nums(), nums(), nums(), nums() };
// not sure if this is different: (note the additional brackets)
// std::vector< int > v({ nums(), nums(), nums(), nums(), nums() });
for( auto i : v )
{
std::cout << i;
}
return 0;
}
答案 0 :(得分:4)
根据C ++11§8.5.4[dcl.init.list]第4段:
4在braced-init-list的initializer-list中, initializer-clause,包括包扩展产生的任何条款 (14.5.3),按照它们出现的顺序进行评估。那是, 与给定相关的每个值计算和副作用 initializer-clause在每个值计算之前排序 与其后面的任何初始化子句相关联的副作用 逗号分隔的初始化列表列表。
据我所知,GCC 4.8.1存在与初始化程序评估相关的错误。我在这里描述了
http://cpp.forum24.ru/?1-3-0-00000063-000-0-0-1378892425
虽然文字是用Russion写的,但可以用英文翻译成谷歌翻译。