«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему GCC не может инициализировать std::array со списками инициализации?

Почему GCC не может инициализировать std::array со списками инициализации?

Опубликовано 19 ноября 2024 г.
Просматривать:635

Why Does GCC Fail to Initialize std::array with Initialization Lists?

Списки инициализации и std::array: ошибка GCC

Класс std::array в стандартной библиотеке C предоставляет фиксированную контейнер массива размеров. Принято считать, что этот класс поддерживает списки инициализации.

Однако при использовании GCC 4.6.1 попытки инициализировать экземпляры std::array с использованием следующего синтаксиса терпят неудачу:

std::array<:string> strings = { "a", "b" };
std::array<:string> strings({ "a", "b" });

Несмотря на то, что списки инициализации работают с std::vector, такое поведение с std::array вызывает проблемы вопросы о стандарте C или о потенциальной проблеме GCC.

std::array's Внутренняя работа

std::array по сути представляет собой структуру, инкапсулирующую массив. Его структура похожа на:

template
struct std::array {
  T a[size];
};

В отличие от std::vector, у которого есть конструктор, принимающий списки инициализаторов, у std::array такой конструктор отсутствует.

Агрегированная инициализация

Хотя std::array не имеет явного конструктора для списков инициализации, в C 11 он считается агрегатным типом. Таким образом, его можно инициализировать агрегатно. Однако для инициализации массива внутри структуры требуется дополнительный набор фигурных скобок:

std::array<:string> strings = {{ "a", "b" }};

Потенциальная ошибка GCC

Стандарт C позволяет опускать дополнительные фигурные скобки при такой инициализации. Поэтому вполне вероятно, что неспособность GCC обрабатывать этот синтаксис без них является ошибкой.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3