代码之家  ›  专栏  ›  技术社区  ›  Stéphane

C++编译器如何处理这个初始值设定项列表?

  •  4
  • Stéphane  · 技术社区  · 8 年前

    使用以下初始值设定项列表时:

    for (int i : {3, 1, 6, 4})
    {
        std::cout << "i=" << i << std::endl;
    }
    

    输出的顺序是相同的,3、1、6,最后是4。所以我知道编译器必须使用类似 std::vector<int> 而不是 std::set<int> .

    这有保证吗?在哪里可以找到解释编译器必须如何解释的文档 {3, 1, 6, 4} .

    2 回复  |  直到 8 年前
        1
  •  9
  •   R Sahu    8 年前

    您正在创建的实例 std::initializer_list<int> http://en.cppreference.com/w/cpp/utility/initializer_list 有关详细信息。

    从该页面:

    类型的对象 std::initializer_list<T> 是一个轻量级代理对象,提供对类型为 const T .

    输出顺序得到保证。然而,这并不是因为编译器创建了 std::vector<int> . 这是有保证的,因为有 int s位于 initializer_list .

        2
  •  6
  •   Ron Alan    8 年前

    你的 range based loop 正在使用 braced-init-list 作为范围表达式,用于构造类型为的临时对象 std::initializer_list<int> . 订单有保证,因为8.5.4.5。第段 n4140 draft / standard 国家(重点矿山):

    std::initializer\u list类型的对象<E>由 初始化列表 犹如 实施分配了一个临时 N个元素的数组