Почему поведение C ++ initializer_list для std :: vector и std :: array отличается?

код:

std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};

Зачем мне нужны двойные фигурные скобки для std :: array?

64 голоса | спросил Sungmin 9 J000000Monday12 2012, 21:30:24

1 ответ


0

std::array<T, N> - это агрегат: в нем нет объявленных пользователем конструкторов, даже если он не принимает std::initializer_list. Инициализация с использованием фигурных скобок выполняется с использованием агрегатной инициализации , функции C ++, унаследованной от C.

«Старый стиль» инициализации агрегата использует =:

std::array<int, 4> y = { { 1, 2, 3, 4 } };

При этом старом стиле инициализации агрегата могут быть исключены дополнительные фигурные скобки, так что это эквивалентно:

std::array<int, 4> y = { 1, 2, 3, 4 };

Однако эти дополнительные скобки могут быть исключены только «в объявлении вида T x = { a };» (C ++ 11 §8.5. 1/11), то есть, когда используется старый стиль =. Это правило, разрешающее использование скобок, не применяется для прямой инициализации списка. Сноска здесь гласит: «Брекеты не могут быть исключены при других видах инициализации списка».

В отчете об этом ограничении содержится сообщение об ошибке: CWG дефект # 1270 . Если предложенное решение будет принято, исключение скобок будет разрешено для других форм инициализации списка, и следующее будет правильно сформировано:

std::array<int, 4> y{ 1, 2, 3, 4 };

(Шляпная подсказка Вилле Воутилайнену о том, как найти отчет о дефекте.)

ответил James McNellis 9 J000000Monday12 2012, 21:32:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132