Это ожидаемое поведение, поскольку в C ++ 11:
Объект std :: initializer_list создается автоматически, когда: ... список фигурных скобок init-list привязан к auto, в том числе вранжированный для цикла
Поэтому, когда вы присваиваете {x1, x2, ..., xn}
'auto', вы получаете объект типа std::initializer_list<decltype(x1)>
, если все значения имеют одинаковый тип (я пропускаю здесь ссылки и cvдля простоты):
auto a = {5}; // std::initializer_list<int>
auto b {5}; // std::initializer_list<int>
auto c = {1, 2}; // std::initializer_list<int>
auto d {1, 2}; // std::initializer_list<int>
Однако в C ++ 17 это было изменено.Были добавлены следующие правила:
- для автоматического вывода списка инициализации будет выведен std :: initializer_list, если все элементы в списке имеют одинаковый тип, или будут неправильно сформированы.
- для прямой инициализации списка автоматическое удержание выводит T, если список имеет один элемент, или будет некорректно сформировано, если имеется более одного элемента.
Так что, когда вы компилируете с C ++ 17соответствующий компилятор вы получите
auto a = {42}; // std::initializer_list<int>
auto b {42}; // int
auto c = {1, 2}; // std::initializer_list<int>
auto d {1, 2}; // error, too many
Я считаю, что gcc 8.2 не обрабатывает -std = c ++ 11 для этой ситуации должным образом