std :: initializer列表全局/静态对象的生命周期

Red*_*oft 4 c++ lifetime language-lawyer

std::initializer_list以列表中的元素复制到另一个容器主要用作类构造/功能参数.但是如何使用创建全局对象std::initializer_list呢?例如:

struct ElemType {
    const char* name;
    bool        flag;
};

std::initializer_list<ElemType> MyGlobalData = { {"One",true}, {"Two",false} };
Run Code Online (Sandbox Code Playgroud)

如果要查看std::initializer_list模板定义(在Visual Studio 2017中检查),它只包含2个数据成员:const _Elem *_First_Last.这意味着初始化列表数据应存储在自动变量中.在这种情况下它的寿命是多少?

在Visual Studio 2017中测试的此类示例看起来效果很好.但我怀疑这种行为是否符合最新的C++标准.

Igo*_*nik 6

它定义明确.

[dcl.init.list]/5类型的对象std::initializer_list<E>是从初始化列表构造的,就好像实现生成并实现了(7.4)类型为"array of N const E" 的prvalue ,其中N是初始化列表中的元素数.

[dcl.init.list]/6该数组的生命周期与任何其他临时对象(15.2)相同,只是initializer_list从数组初始化对象会延长数组的生命周期,就像绑定对临时对象的引用一样.

强调我的.

  • @Igor,您可以引用 /6 的示例:“对于 [`std::initializer_list&lt;int&gt; i3 = { 1, 2, 3 };`],initializer_list 对象是一个变量,因此数组在生命周期内持续存在的变量。” (3认同)
  • @SergeyA/6中的"数组"指的是/ 5中提到的"类型数组的prvalue" (2认同)
  • @SergeyA:你误解了一些东西。它不是创建一个 `initalizer_list` 然后将它复制到它要存储的 `initializer_list` 中。它正在从临时数组初始化的全局对象中创建 `initializer_list`。当您使用花括号初始化器列表初始化对象时,没有“创建和复制”废话。 (2认同)