我有以下代码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).
事实#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)
初始化程序可以用两种不同的方式解析:
{"bar", "baz"}是std::string使用双迭代器构造函数的单个的初始化程序.外支撑创造了一个initializer_list<std::string>"bar"并且"baz"是两个std::strings的初始化器.{"bar", "baz"}创造一个initializer_list<std::string>.外支架是多余的.你想要#2.标准说编译器必须选择#1.随之而来的是浩劫.
| 归档时间: |
|
| 查看次数: |
442 次 |
| 最近记录: |