Поведение списка инициализаторов: различия в std::vector и std::array
В то время как std::vector и std::array в обоих контейнерах C их поведение со списками инициализаторов различается. В этой статье мы рассмотрим тонкости агрегатной инициализации и поймем, почему для std::array требуются двойные фигурные скобки.
Рассмотрим следующий фрагмент кода, который инициализирует std::vector и std:: массив:
std::vectorx{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::arrayy = { { 1, 2, 3, 4 } };
Однако при использовании прямой инициализации списка (введенной в C 11) этот = синтаксис больше не действителен. Кроме того, исключение скобок, которое позволяет опускать дополнительные фигурные скобки, разрешено только в объявлениях со старым синтаксисом =. Для прямой инициализации списка дополнительные фигурные скобки обязательны.
Дефект CWG
Отчет о дефекте CWG (дефект CWG № 1270) призван устранить это ограничение, разрешив исключение скобок для другие формы инициализации списка. В случае принятия следующий код будет правильно сформирован:
std::arrayy{ 1, 2, 3, 4 };
В заключение, разница в поведение между std::vector и std::array со списками инициализаторов вытекает из их фундаментальных характеристик как класса с определяемыми пользователем конструкторами и агрегата, использующего агрегатную инициализацию соответственно. Двойные фигурные скобки необходимы для того, чтобы std::array соответствовал правилам агрегатной инициализации, тогда как std::vector допускает прямую инициализацию с использованием одного набора фигурных скобок, не полагаясь на синтаксис агрегатной инициализации старого стиля.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3