做m [0]时,std :: map <string,int =“”>崩溃

时间:2019-05-30 16:29:12

标签: c++ c++11

以下崩溃:

  std::map<std::string, int> m1{ {"0", 0}, { "1", 1 }};
  // auto melem = m1["0"]; // OK
  auto melem = m1[0];

那是为什么?

1 个答案:

答案 0 :(得分:7)

不幸的是(感谢C!),可以从整数std::string构造一个0,因为它算作空指针常量

但是,it's not really possible

  

构造字符串,其内容用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

但是,不幸的是,您不能依靠它,并且在构建过程中也不会收到任何警告。