Инициализация std::pair через std::initializer_list не работает при инициализации std::array?

Я хочу инициализировать std::array из std::pair через std::initializer_list.

pair<int, int> p = {3,4};//ok
array<pair<char,char>, 3> p = { make_pair('{','}'), make_pair('[',']'), make_pair('(',')') };//ok
array<pair<char,char>, 3> p = { {'{','}'}, {'[',']'}, {'(',')'} };//not ok

Почему мой третий вариант не работает? Более того, это также отлично работает:

vector<pair<char, char>> brackets = { {'{','}'}, {'[',']'}, {'(',')'} };

person user3455638    schedule 06.08.2017    source источник


Ответы (1)


Инициализация std::array с помощью списка инициализаторов в фигурных скобках немного сложна, потому что вам нужен дополнительный набор фигурных скобок (поскольку это агрегат):

array<pair<char,char>, 3> p = {{ {'{','}'}, {'[',']'}, {'(',')'} }};
                               ^                                 ^

std::vector отличается, потому что использование списка инициализаторов в фигурных скобках приведет к вызову конструктора std::initializer_list, а не к использованию агрегатной инициализации, такой как std::array.

person Rakete1111    schedule 06.08.2017