Инициализация по умолчанию - это термин из Стандарта, который потенциально означает отсутствие инициализации вообще, поэтому вы, вероятно, имеете в виду нулевую инициализацию. .
Описание на cppreference.com на самом деле немного вводит в заблуждение. std::array
является агрегатным классом, и если тип элемента является примитивным, это POD: «простые старые данные» с семантикой, близкой к языку C. Неявно определенный конструктор std::array< int, N >
является тривиальным один , который абсолютно ничего не делает.
Синтаксис, подобный std::array< int, 3 >()
или, std::array< int, 3 > x{}
который предоставляет обнуленные значения, не делает этого путем вызова конструктора. Получение нулей является частью инициализации значения , указанной в C ++ 11 §8.5 / 8:
Инициализировать значение объекта типа T означает:
- если T является типом класса (возможно cv-квалифицированным) без предоставленного пользователем или удаленного конструктора по умолчанию, тогда объект инициализируется нулем…, а если T имеет нетривиальный конструктор по умолчанию, объект инициализируется по умолчанию;
std::array
не имеет конструктора по умолчанию, предоставляемого пользователем, поэтому он инициализируется нулем. Он имеет неявно определенный конструктор по умолчанию, но он тривиален, поэтому он никогда не инициализируется по умолчанию. (Но это не имеет значения, поскольку тривиальная инициализация по определению не имеет никакого эффекта во время выполнения.)
если нет, существует ли синтаксис, который будет работать со всеми массивами (включая массивы нулевого размера) для инициализации всех элементов их значениями по умолчанию?
Массивы в стиле C и std::array
оба являются агрегатами, и способ полной инициализации нулями любого агрегата - это синтаксис = {}
. Это работает с C ++ 98. Обратите внимание, что массивы в стиле C не могут иметь нулевой экстент, и sizeof (std::array< X, 0 >)
он не равен нулю.
T x[N]
синтаксису.