C++ std::map在执行m[0]时崩溃

C++ std::map在执行m[0]时崩溃,c++,c++11,C++,C++11,以下崩溃: std::map<std::string, int> m1{ {"0", 0}, { "1", 1 }}; // auto melem = m1["0"]; // OK auto melem = m1[0]; 为什么会这样?不幸的是,谢谢你!可以从整数0构造std::string,因为它计为空指针文本 然而: 使用由s指向的以null结尾的字符串的副本初始化的内容构造字符串。字符串的长度由第一个空字符决定。如果[s,s+Traits::length不是有效范

以下崩溃:

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

为什么会这样?

不幸的是,谢谢你!可以从整数0构造std::string,因为它计为空指针文本

然而:

使用由s指向的以null结尾的字符串的副本初始化的内容构造字符串。字符串的长度由第一个空字符决定。如果[s,s+Traits::length不是有效范围(例如,如果s是空指针),则该行为未定义

由于试图从空指针创建std::string,导致崩溃

至少有一项违反合同的行为是具有描述性名称的[未处理]异常:

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid

但不幸的是,您不能依赖于此,并且在生成过程中不会收到任何警告。0不是字符串。为什么希望它工作?为什么不应该崩溃?运算符[]的参数给定映射的类型必须为key\u type。basic\u string const CharT*s,const Allocator&alloc=Allocator;:使用由s指向的以空结尾的字符串的副本初始化的内容构造字符串。字符串的长度由第一个空字符确定。如果[s,s+Traits::Length不是有效的范围,例如,如果s是空指针。@MatthieuBrucher的答案如下所示cheers@mkrieger1公平地说,这类事件的崩溃在逻辑上是不可预料的。谢谢,这真的很有帮助。事实上,没有警告,只是崩溃。我认为这与地图有关,但实际上不是。正在进行som像std::string s=0这样的东西足以使程序崩溃。谢谢!@Korchkidu没错: