std::initializer_list和元素的求值顺序
std::initializer_list and order of evaluation of the elements
逗号(,
)是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§8.5.4[dcl.init.list]第4段:
4在支撑init列表的初始值设定项列表中初始值设定项子句,包括由包扩展产生的任何子句(14.5.3),按照它们出现的顺序进行评估。也就是说,与给定值相关的每个值计算和副作用initializer子句在每次值计算之前进行排序,并且与中的任何初始值设定项子句关联的副作用初始值设定项列表的逗号分隔列表。
据我所知,GCC 4.8.1有一个与初始化程序评估相关的错误。我在这里描述了
http://cpp.forum24.ru/?1-3-0-00000063-000-0-0-1378892425
虽然文本是用俄语写的,但可以简单地用英语翻译,例如谷歌翻译。
相关文章:
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 序列容器 - 只能按顺序访问元素
- 如何检查 2 个 c++ 数组在 O(1) 或 O(log n) 时间复杂度中是否相同(所有元素都相同,顺序很重要)?
- 保留从一个多集复制到另一个多集的元素的顺序
- 如何在 C++ 中将从文本文件中读取的元素推送和弹出到数组中,并按 Revserse 顺序输出堆栈?
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 编写一个递归功能,该功能采用数组并以相反顺序显示元素,而无需在末尾启动数组的索引
- 编写链接函数的更短/更有效的方法,该函数按字典顺序添加新元素
- stable_sort不遵守元素的顺序
- 从容器中获取随机元素,该容器在恒定时间内没有严格的元素顺序
- 如何在默认和二维数组中找到顺序扩大元素的位置
- 多重映射是否保证广告顺序与其初始值设定项中给出的元素顺序匹配
- 调用std::nth_element后第n个元素之前的元素顺序
- 控制地图中元素的顺序
- 指针集中元素的顺序
- 一种按排序顺序保持元素的数据结构,支持快速插入和计算连续元素之间的最大差异
- 双向循环列表中的赋值运算符以错误的顺序添加元素
- 更改STL多集中两个相等元素的顺序
- 初始值设定项列表中元素的求值顺序