2015-03-25 13 views
18

ja niedawno słoikach przez to:Dlaczego mapa <ciąg, ciąg> akceptuje wartości jako wartości?

#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; 
} 

Drukuje 'X', który jest 88 w ASCII.

Dlaczego mapa ciągów przyjmuje wartości ints jako wartości? Dokumentacja dla mapy operator[] mówi, że zwraca mapped_type&, która jest w tym przypadku string& i nie ma niejawnej konwersji z int, prawda?

+9

Powiązane: [Dlaczego C++ zezwala na przypisanie liczby całkowitej do ciągu znaków?] (Http://stackoverflow.com/q/1177704/335858). – dasblinkenlight

Odpowiedz

20

Dzieje się tak, ponieważ, jak mówisz, operator[] zwraca std::string&, który definiuje operator= (char c). Twój skomentowany przykład nie wywołuje operatora przypisania, to jest copy-initialization, który spróbuje wywołać jawne konstruktory klasy, których nie ma żadnych odpowiednich w std::string.

3

Aby dopełnić obrazu, należy pamiętać, że:

strings[88] = "key"; 

nie skompilować, ponieważ nie ma std::string konstruktor z char/int. Dla char, std::string definiuje tylko operator przypisania.

Powiązane problemy