使用字符串向量初始值设定项时,我收到运行时错误"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`"
我在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"}};
初始化器可以用两种不同的方式解析:
{"bar", "baz"}
是使用双迭代器构造函数的单个std::string
的初始化器。外大括号创建initializer_list<std::string>
"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"};
相关文章:
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- "terminate called after throwing an instance of std::invalid_argument' what(): stoi ?"
- 使用 QMediaPlayer 时出现"QWidget::paintEngine: Should no longer be called"
- 错误"pure virtual method called",当此方法已被覆盖时
- NDK 构建中的异常"error: expected ';' after top level declarator"
- 程序在VS2017上以"abort() has been called"错误结束
- 谷歌模拟 - 怎么说"function must be called ONCE with a certain parameter but ok to be called many times with
- 使用 -march 编译会导致线程说"pure virtual method called"
- 标准::复制失败,"cannot seek vector iterator after end"
- std::bind and stack-use-after-scope
- C++:在字符串数据类型中创建单词"letter after letter"
- C++ "Pure Virtual Function Being Called"失败
- "Member function must be called or its address taken in function" C++错误
- 如何调试错误消息"abort() has been called"?
- What value should `std::stringstream::fail()` return after r
- C++线程未加入"Termination called without active exception"
- 在 gcc 4.4 上"pure virtual function called",但在较新版本或 clang 3.4 上不
- 显示"terminate called after throwing an instance of 'std::bad_alloc'"时出错
- 使用字符串向量初始值设定项时,我收到运行时错误"terminate called after throwing instance of `std::length_error`"
- 为什么我在投入析构函数时总是"terminate called after throwing an instance of..."?