使用字符串向量初始值设定项时,我收到运行时错误"terminate called after throwing instance of `std::length_error`"

When using string vector initializer, I get a runtime error "terminate called after throwing instance of `std::length_error`"

本文关键字:after called terminate error throwing instance std 运行时错误 of length 向量      更新时间:2023-10-16

我在test.cpp:中有以下代码

#include <vector>
#include <string>
class A {
public:
  static const std::vector<std::string> foo;
};
const std::vector<std::string> A::foo {{"bar", "baz"}};
int main() {}

它可以编译,但当我运行它时,我会得到以下错误:

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_S_create
Aborted (core dumped)

为什么我会出现此错误?

希望无关:我使用的是g++4.8.2和-std=c++11

旁白:我有意在类外初始化foo。如果我在类内这样做,编译器告诉我需要类外初始化(这很荒谬,imo)

事实#1:字符串文字const char [N]可以衰减为const char *

事实#2:std::string有一个采用两个迭代器的构造函数。

事实#3:指针是一个迭代器。

结果:在中

const std::vector<std::string> A::foo {{"bar", "baz"}};

初始化器可以用两种不同的方式解析:

  1. {"bar", "baz"}是使用双迭代器构造函数的单个std::string的初始化器。外大括号创建initializer_list<std::string>
  2. "bar""baz"是两个std::string的初始化器。{"bar", "baz"}创建一个initializer_list<std::string>。外部支架是多余的

你想要#2。标准规定编译器必须选择#1。哈沃克随之而来。

问题出现在矢量初始化中:

const std::vector<std::string> A::foo {{"bar", "baz"}};

你不能使用双括号,我甚至不知道构造函数在那里调用什么(我想是试图从一个没有结束的char*数组创建一个向量)。。。

这个应该有效(注意我去掉了一些括号):

const std::vector<std::string> A::foo {"bar", "baz"};