Почему 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
, не так ли?
Ответы
Ответ 1
Это потому, что, как вы говорите, operator[]
возвращает a std::string&
, который определяет operator= (char c)
. Ваш пример с комментариями не вызывает оператор присваивания, это copy-initialization, который попытается вызвать явные конструкторы класса, из которых нет применимых в std::string
.
Ответ 2
Чтобы завершить изображение, обратите внимание, что:
strings[88] = "key";
не компилируется, поскольку нет конструктора std::string
из char
/int
. Для char
, std::string
определяет оператор присваивания.