std::initializer_list和元素的求值顺序

std::initializer_list and order of evaluation of the elements

本文关键字:顺序 元素 initializer list std      更新时间:2023-10-16

逗号(,)是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

虽然文本是用俄语写的,但可以简单地用英语翻译,例如谷歌翻译。

相关文章: