当使用字符串向量初始化程序时,我得到一个运行时错误"在抛出`std :: length_error`的实例后调用终止"

Tre*_*ing 1 c++ c++11

我有以下代码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() {}
Run Code Online (Sandbox Code Playgroud)

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

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_S_create
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

为什么我收到此错误?

希望无关紧要:我正在使用g ++ 4.8.2 -std=c++11.

旁白:我故意foo在课外初学.如果我在类中进行,编译器会告诉我需要一个类外的初始化(这很荒谬,imo).

T.C*_*.C. 8

事实#1:一个字符串文字,它const char [N]可以衰变成一个const char *.

事实#2:std::string有一个带有两个迭代器的构造函数.

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

造成

const std::vector<std::string> A::foo {{"bar", "baz"}};
Run Code Online (Sandbox Code Playgroud)

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

  1. {"bar", "baz"}std::string使用双迭代器构造函数的单个的初始化程序.外支撑创造了一个initializer_list<std::string>
  2. "bar"并且"baz"是两个std::strings的初始化器.{"bar", "baz"}创造一个initializer_list<std::string>.外支架是多余的.

你想要#2.标准说编译器必须选择#1.随之而来的是浩劫.