Инициализация 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}}}
Другие вопросы по тегам