c++ 全局变量初始化(initializer_list的向量)

Posted

技术标签:

【中文标题】c++ 全局变量初始化(initializer_list的向量)【英文标题】:c++ global variable initialization (vector of initializer_list) 【发布时间】:2020-08-15 04:19:29 【问题描述】:
#include <iostream>
#include <initializer_list>
#include <vector>

auto const v = std::vector<std::initializer_list<int>>  0, 1, 2 ,  3, 4  ;

int main()

    for (auto const& l : v)
        for (auto const& i : l)
            std::cout << i << " ";

此代码输出垃圾,例如:13386064 0 -1305220240 32764 0(在几个不同的编译器下)。

如果我将v 更改为std::vector&lt;std::vector&lt;int&gt;&gt;,或将定义移动到main 中,它会按预期打印0 1 2 3 4

为什么?

【问题讨论】:

你真的应该从一开始就不要使用全局变量... 因为 0,1,2 是临时数组,在完整表达式结束时会被删除。所以你的向量有初始化列表的浅拷贝作为代理对象,由指向数据的指针和数据的长度组成,但是没有更多的数据要指向。 在原始初始化列表对象的生命周期结束后,不能保证底层数组存在。来自reference 听起来很有道理。我猜“原始初始化列表”将是向量构造函数中使用的那个。 @rafix07 如果您有答案,请照原样发布,以便进行通常的同行评审。这就是这个问答网站的工作方式。谢谢。 这能回答你的问题吗? lifetime of a std::initializer_list return value 【参考方案1】:

尝试在 int 之前添加 const

auto const v = std::vector<std::initializer_list<const int>>  0, 1, 2 ,  3, 4  ;

【讨论】:

以上是关于c++ 全局变量初始化(initializer_list的向量)的主要内容,如果未能解决你的问题,请参考以下文章

重点关注:C++全局变量初始化

重点关注:C++全局变量初始化

C++ 全局 静态结构体变量的初始化

C++面试题目汇总

c++ 全局变量初始化(initializer_list的向量)

通过调用 C++ 中的静态类函数初始化全局静态变量