Подтвердить что ты не робот

Почему map <string, string> принимает значения ints как значения?

Недавно я был потрясен этим:

#include <map>
#include <string>
#include <iostream>

using namespace std;

int main() {
    map<string, string> strings;
    strings["key"] = 88;  // surprisingly compiles
    //map<string, string>::mapped_type s = 88;  // doesn't compile as expected

    cout << "Value under 'key': '" << strings["key"] << "'" << endl;

    return 0;
}

Он печатает 'X', который является 88 в ASCII.

Почему строковая карта принимает значения ints как значения? В документации для map operator[] говорится, что он возвращает mapped_type&, который в этом случае равен string& и не имеет неявного преобразования из int, не так ли?

4b9b3361

Ответ 1

Это потому, что, как вы говорите, operator[] возвращает a std::string&, который определяет operator= (char c). Ваш пример с комментариями не вызывает оператор присваивания, это copy-initialization, который попытается вызвать явные конструкторы класса, из которых нет применимых в std::string.

Ответ 2

Чтобы завершить изображение, обратите внимание, что:

strings[88] = "key"; 

не компилируется, поскольку нет конструктора std::string из char/int. Для char, std::string определяет оператор присваивания.