std::pair 内的初始化列表

rin*_*rin 26 c++ std std-pair

这段代码:

#include <iostream>
#include <string>

std::pair<std::initializer_list<std::string>, int> groups{ { "A", "B" }, 0 };

int main()
{
    for (const auto& i : groups.first)
    {
        std::cout << i << '\n';
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译但返回段错误。为什么?

在 gcc 8.3.0 和在线编译器上测试。

bol*_*lov 24

std::initializer_list不是为了存储,它只是为了......初始化。在内部,它只存储一个指向第一个元素和大小的指针。在您的代码中,std::string对象是临时对象,initializer_list既不拥有它们的所有权,也不延长它们的寿命,也不复制它们(因为它不是容器),因此它们在创建后立即超出范围,但您initializer_list仍然持有指向它们的指针。这就是您遇到分段错误的原因。

对于存储,您应该使用容器,例如std::vectorstd::array