std :: initializer_list和元素的评估顺序

时间:2013-11-28 12:23:57

标签: c++ c++11 initializer-list sequence-points

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

1 个答案:

答案 0 :(得分:4)

根据C ++11§8.5.4[dcl.init.list]第4段:

  

4在br​​aced-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写的,但可以用英文翻译成谷歌翻译。