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<std::vector<int>>
,或将定义移动到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的向量)的主要内容,如果未能解决你的问题,请参考以下文章