2015-03-25 13 views
18

Sono stato di recente scosso da questo:Perché map <string, string> accetta valori come input?

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

la stampa 'X', che è 88 in ASCII.

Perché una mappa di stringhe accetta valori come valori? La documentazione per la mappa operator[] dice che restituisce mapped_type& che è string& in questo caso e non ha una conversione implicita da int, vero?

+9

Correlati: [Perché C++ consente di assegnare un intero a una stringa?] (Http://stackoverflow.com/q/1177704/335858). – dasblinkenlight

risposta

20

Questo perché, come dici tu, operator[] restituisce un std::string&, che definisce un operator= (char c). Il tuo esempio commentato non chiama l'operatore di assegnazione, è copy-initialization, che proverà a chiamare costruttori espliciti della classe, di cui non ci sono quelli applicabili in std::string.

3

Per completare il quadro, si noti che:

strings[88] = "key"; 

non compila in quanto non v'è alcuna std::string costruttore da char/int. Per char, std::string definisce solo l'operatore di assegnazione.

Problemi correlati