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 ++标准。
答案 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
对象延长数组的生存期,就像将引用绑定到临时目录一样。
强调我的。