2

逗号 ( ,) 是 中的序列点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;
}
4

1 回答 1

4

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

4 在花括号初始化列表的初始化列表中,初始化子句,包括任何由包扩展 (14.5.3) 产生的子句,按照它们出现的顺序进行评估。也就是说,与给定初始化子句相关联的每个值计算和副作用在初始化器列表的逗号分隔列表中与任何初始化子句相关联的每个值计算和副作用之前进行排序。

据我所知,GCC 4.8.1 有一个与初始化程序评估相关的错误。我在这里描述过

http://cpp.forum24.ru/?1-3-0-00000063-000-0-0-1378892425

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

于 2013-11-28T12:48:04.047 回答