将`int`值插入`std :: map`,它应该存储`std :: string`

Kir*_*rov 2 c++ string int map

我刚才有以下案例:

std::map< int, std::string > mm;
mm[ 1 ] = 5;
std::cout << mm[1];
assert( mm.find( 1 ) != mm.end() );
Run Code Online (Sandbox Code Playgroud)

但这打印任何东西和assert没有失败的.

这似乎是一个错字,它一定是mm[ 1 ] = '5';.在我弄明白之后,我尝试了:

std::string s1( 5 );
std::string s2 = 5;
Run Code Online (Sandbox Code Playgroud)

没有,如果这编译.怎么了?

Kir*_*rov 7

std::map::operator[]首先创建一个带有type的元素std::map::mapped_type,然后返回对它的引用.

那么,这里发生的是以下内容:

  1. std::string 对象被创建并默认构造;
  2. 将创建的对象插入到 std::map
  3. 返回对inserted元素的引用
  4. operator= 在这个对象上被调用

在这种情况下,std::string::operator=被称为.

这里出现了"神奇" - 有一个超载operator=,char以此为参数.此外,该数字可以隐式转换为char.那么,实际发生的是:

std::string s;
s = (char)5;
Run Code Online (Sandbox Code Playgroud)

例如,这个:

mm[ 1 ] = 65; // ASCII for 'A'
mm[ 2 ] = 98; // ASCII for 'b'
std::cout << m[ 11 ] << mm[ 2 ];
Run Code Online (Sandbox Code Playgroud)

将打印Ab.