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

Почему `std::array` требует двойных фигурных скобок в списках инициализаторов?

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

Why Does `std::array` Require Double Curly Braces in Initializer Lists?

Поведение списка инициализаторов: различия в std::vector и std::array

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

Рассмотрим следующий фрагмент кода, который инициализирует std::vector и std:: массив:

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

std::vector Инициализация

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

std::array Инициализация

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

При агрегатной инициализации «старого стиля» используются знак равенства и двоеточия:

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

Однако при использовании прямой инициализации списка (введенной в C 11) этот = синтаксис больше не действителен. Кроме того, исключение скобок, которое позволяет опускать дополнительные фигурные скобки, разрешено только в объявлениях со старым синтаксисом =. Для прямой инициализации списка дополнительные фигурные скобки обязательны.

Дефект CWG

Отчет о дефекте CWG (дефект CWG № 1270) призван устранить это ограничение, разрешив исключение скобок для другие формы инициализации списка. В случае принятия следующий код будет правильно сформирован:

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

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

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

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

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

Copyright© 2022 湘ICP备2022001581号-3