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

时间:2018-12-26 15:49:58

标签: c++ language-lawyer lifetime

std::initializer_list通常用作类构造函数/函数参数,以便将列表元素复制到另一个容器中。但是如何使用std::initializer_list创建全局对象呢?例如:

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

std::initializer_list<ElemType> MyGlobalData = { {"One",true}, {"Two",false} };

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

在Visual Studio 2017中测试的此类示例运行良好。但是我怀疑这种行为是否符合最新的C ++标准。

1 个答案:

答案 0 :(得分:6)

定义明确。

  

[dcl.init.list] / 5 根据初始化程序列表构造std::initializer_list<E>类型的对象,就好像实现生成并实现了(7.4)类型为“ array”的prvalue一样。的N const E”,其中N是初始值设定项列表中的元素数。

     

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

强调我的。