【发布时间】:2013-11-28 12:23:56
【问题描述】:
逗号 (,) 是 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;
}
【问题讨论】:
-
C++11 中不再有“序列点”。不过求值的顺序是有保证的,确实是有顺序的,不过我会先搜索重复再回答。
-
@DyP - 谢谢。我没有找到重复的,虽然我很确定我已经看到了类似的问题。我几乎可以肯定,订单是有保证的,但不是 100%。
-
[dcl.init.list]/4 "也就是说,与给定 initializer-clause 相关的每个值计算和副作用都在每个值计算和副作用之前排序与 initializer-list 的逗号分隔列表中的任何 initializer-clause 相关联。"
-
@Kiril:是的,现在是“sequenced-before”和“sequenced-after”的概念。
-
同时搜索 [c++11] 标签 ;) 回答代码注释中的问题:不,没有什么不同。在这两种情况下都是列表初始化,因此相同的规则适用于 wrt 排序。第二个可能具有不同的含义(在一般情况下),但在这里具有相同的含义:使用通过列表初始化构造的
initializer_list调用vector的initializer_list构造函数.
标签: c++ c++11 initializer-list sequence-points