Списки инициализации и 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