Ispirato da this answer, ho provato il prossimo esempio:Perché non è possibile omettere le parentesi durante l'inizializzazione della mappa?
#include <map>
#include <string>
#include <iostream>
int main()
{
const std::map< int, std::string > mapping = {
1, "ONE",
2, "TWO",
};
const auto it = mapping.find(1);
if (mapping.end() != it)
{
std::cout << it->second << std::endl;
}
else
{
std::cout << "not found!" << std::endl;
}
}
e la compilazione non riuscita con il prossimo messaggio di errore (g ++ 4.6.1):
gh.cpp:11:5: error: could not convert '{1, "ONE", 2, "TWO"}' from '<brace-enclosed initializer list>' to 'const std::map<int, std::basic_string<char> >'
So come risolvere il problema:
const std::map< int, std::string > mapping = {
{1, "ONE"},
{2, "TWO"},
};
ma perché la compilazione non riesce nell'esempio in alto?
'std :: pair' è un aggregato, pertanto non dovrebbe richiedere un elenco di inizializzazione su di esso (come è spiegato in [la risposta che ho collegato] (http://stackoverflow.com/a/ 11735045/476681) o, mi sbaglio? –
@ BЈовић in realtà, 'std :: pair' non è un aggregato.Non conosco le regole per quando' {} 'può essere * omesso *, ma in questo caso non avrebbe senso permetterlo. Potrei essere in grado di dire più tardi ... – juanchopanza
@ BЈовић guardando §8.5, penso che il motivo è che l'elisione di rinforzo è consentita solo per i tipi aggregati. – juanchopanza