Инициализация std::initializer_list
Как я могу инициализировать initializer_list
состав неупорядоченных элементов?
Например, рассмотрим следующий код:
#include <unordered_map>
#include <string>
using Type = std::unordered_map<std::string, int>;
void foo(std::initializer_list<Type> l) {}
int main()
{
Type x = {{"xxx", 0}, {"yyy", 1}}; // compile fine
// std::initializer_list<Type> y = {{"xxx", 0}, {"yyy", 1}};
// foo({{"xxx", 0}, {"yyy", 1}});
}
Если я раскомментирую первую строку, я получаю (g++ 6.1.1) ошибку:
ошибка: не удалось преобразовать '{{"xxx", 0}, {"yyy", 1}}' из '' в 'std::initializer_list, int> >' std:: initializer_list y = {{"xxx", 0}, {"гггг", 1}};
В конце я хочу позвонить. foo
как вторая закомментированная строка, которая тоже не компилируется.
3 ответа
Вам не хватает набора {}. Тебе нужно иметь
{{{"xxx", 0}}, {{"yyy", 1}}}
Внутри {}
создает std::pair<std::string, int>
для std::inializer_list<std::pair<std::string, int>>
карта построена из. Следующий уровень вверх создает каждую карту для std::inializer_list<std::pair<std::string, int>>
построить каждую карту в std::initializer_list<Type>
, Внешний самый {}
это степень std::initializer_list<Type>
, Мы можем расширить это до
foo({{{"xxx", 0}}, {{"yyy", 1},{"zzz", 2}}});
который является std::initializer_list<Type>
где первая карта имеет одну запись, а вторая карта имеет 2.
В строке номер 2 вы пытаетесь инициализировать std::initializer_list из std::unordered_map, но вы даете ему аргументы только для unordered_map. Добавление другого набора скобок решит проблему.
#include <unordered_map>
#include <string>
using Type = std::unordered_map<std::string, int>;
void foo(std::initializer_list<Type> l) {}
int main()
{
Type x = {{"xxx", 0}, {"yyy", 1}}; // compile fine
//initialization for std::unordered_map<std::string, int>
// std::initializer_list<Type> y = {{"xxx", 0}, {"yyy", 1}};
//correct initialization, each std::unordered_map has exactly 1 element in it
std::initializer_list<Type> y = { {{"xxx", 0}}, {{"yyy", 1}}}
// foo({{"xxx", 0}, {"yyy", 1}}); //As before
foo({{{"xxx", 0}}, {"yyy", 1}}}); //Correct call
}
Вам не хватает скобок. {{"xxx", 0}, {"yyy", 1}}
является прекрасным инициализатором для Type
, но для списка Type
с одним unordered_map
, тебе нужно
{{{"xxx", 0}, {"yyy", 1}}}
Или для списка Type
с двумя unordered_map
каждый с одной парой,
{{{"xxx", 0}}, {{"yyy", 1}}}