【问题标题】:std::initializer_list and order of evaluation of the elements [duplicate]std::initializer_list 和元素的评估顺序[重复]
【发布时间】: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 调用vectorinitializer_list 构造函数.

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


【解决方案1】:

根据 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 2021-07-07
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多