以下崩溃:
std::map<std::string, int> m1{ {"0", 0}, { "1", 1 }};
// auto melem = m1["0"]; // OK
auto melem = m1[0];
那是为什么?
答案 0 :(得分:7)
不幸的是(感谢C!),可以从整数std::string
构造一个0
,因为它算作空指针常量。
构造字符串,其内容用
s
指向的空终止字符串的副本进行初始化。字符串的长度由第一个空字符确定。如果[s, s + Traits::length(s))
不是有效范围(例如,如果s
是空指针),则该行为是不确定的。
由于尝试从空指针创建std::string
而崩溃。
至少有with GCC the result个违反合同的情况是[未处理的]具有描述性名称的异常:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
但是,不幸的是,您不能依靠它,并且在构建过程中也不会收到任何警告。