In C++ 11, sembra come se fosse legale per inizializzare un std::map<std::string, int>
come segue:Quali regole di linguaggio consentono a C++ 11 di dedurre che si tratta di una lista_iniziale di coppie?
std::map<std::string, int> myMap = {
{ "One", 1 },
{ "Two", 2 },
{ "Three", 3 }
};
Intuitivamente, questo ha un senso - l'inizializzazione brace chiusa è una lista di coppie di stringhe, e std::map<std::string, int>::value_type
è std::pair<std::string, int>
(possibilmente con alcune qualifiche const
.
Tuttavia, non sono sicuro di aver capito come funziona la digitazione qui. Se eliminiamo la dichiarazione delle variabili qui e abbiamo solo l'inizializzatore racchiuso tra parentesi, il compilatore non lo saprebbe Stavo guardando uno std::initializer_list<std::pair<std::string, int>>
perché non saprebbe che le coppie rinforzate sono ri presentato std::pair
s. Pertanto, sembra che il compilatore stia differendo in qualche modo l'atto di assegnare un tipo all'inizializzatore racchiuso tra parentesi finché non ha abbastanza informazioni sul tipo dal costruttore std::map
per comprendere che le parentesi graffe nidificate sono per coppie. Non ricordo nulla di simile accadendo in C++ 03; per quanto ne so, il tipo di espressione non dipende mai dal suo contesto.
Quali regole di linguaggio consentono a questo codice di compilare correttamente e al compilatore di determinare il tipo da utilizzare per l'elenco di inizializzazione? Sto sperando in risposte con riferimenti specifici alla specifica C++ 11, dal momento che è davvero interessante che funzioni!
Grazie!
Gli elenchi di bretelle in C++ 03 erano già molto specifici per il contesto di inizializzazione. Non c'è alcuna differenza significativa qui da un aggregato annidato in C++ 03 (forse 'std :: pair myArray []') inizializzato usando le parentesi, salvo che il tipo non è direttamente chiamato, è dedotto da i costruttori disponibili. –
BTW, gli operatori di conversione impliciti (membro 'operator T()') sono l'altro posto in cui il contesto determina il tipo di un'espressione (ed è usato per la risoluzione di sovraccarico). –
'braced-init-list' non è un'espressione e non ha tipo. Non c'è deduzione, solo la risoluzione di sovraccarico tra i costruttori di inizializzatore-elenco (di cui c'è solo uno) – Cubbi