Inspirado por this answer, he intentado siguiente ejemplo:¿Por qué no se pueden omitir las llaves al inicializar el mapa?
#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;
}
}
y la compilación falló con el siguiente mensaje de error (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> >'
Yo sé cómo solucionarlo:
const std::map< int, std::string > mapping = {
{1, "ONE"},
{2, "TWO"},
};
pero ¿por qué la compilación falla en el ejemplo superior?
'std :: pair' es un agregado, por lo tanto, no debería necesitar una lista de inicialización propia (como se explica en [la respuesta que he vinculado] (http://stackoverflow.com/a/ 11735045/476681). O, ¿estoy equivocado? –
@ BЈовић en realidad, 'std :: pair' no es un agregado. No conozco las reglas para cuando' {} 'puede * omitirse *, pero en este caso no tendría sentido permitirlo. Quizás pueda decir más tarde ... – juanchopanza
@ BЈовић mirando a §8.5, creo que la razón es que la elisión de abrazadera solo está permitida para tipos agregados. – juanchopanza