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

时间:2013-11-29 18:28:58

标签: c++ string map int

我刚才遇到以下情况:

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

打印任何内容,assert NOT 失败。

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

std::string s1( 5 );
std::string s2 = 5;

如果编译则无。会发生什么?

1 个答案:

答案 0 :(得分:7)

std::map::operator[]首先创建一个类型为std::map::mapped_type的元素,然后返回对它的引用。

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

  1. std::string对象已创建且默认构造;
  2. 将创建的对象插入std::map
  3. 返回对插入元素的引用
  4. operator=在此对象上调用
  5. 在这种情况下,调用std::string::operator=

    这就是“神奇” - 有一个重载operator=,以char为参数。此外,该号码可以隐式转换为char。那么,实际发生的是:

    std::string s;
    s = (char)5;
    

    例如,这个:

    mm[ 1 ] = 65; // ASCII for 'A'
    mm[ 2 ] = 98; // ASCII for 'b'
    std::cout << m[ 11 ] << mm[ 2 ];
    

    将打印Ab