C++全局变量初始化(初始化列表的向量)

3
#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
为什么?

你真的应该尽量避免在首次使用全局变量... - Jesper Juhl
6
因为{0,1,2}是临时数组,当完整表达式结束时会被删除。因此,您的向量具有浅拷贝的初始化列表作为代理对象,由指向数据和数据长度的指针组成,但没有更多的数据可供指向。原始初始化列表对象的生命周期结束后,并不能保证底层数组仍然存在。 参见参考链接 - rafix07
听起来很有道理。我猜“原始初始化列表”应该是在向量构造函数中使用的那个。 - user673679
@rafix07 当你有答案时,请将其“作为这样”发布,以便进行常规的同行评审。这就是这个问答网站的工作方式。谢谢。 - Asteroids With Wings
这个回答解决了你的问题吗?std::initializer_list返回值的生命周期 - L. F.
1个回答

0

尝试在 int 前添加 const

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接