[C++11] Инициализация по умолчанию std :: array?


Answers

Инициализация по умолчанию - это термин из Стандарта, потенциально не означающий никакой инициализации вообще, поэтому вы, вероятно, имеете в виду нулевую инициализацию .

Описание на 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-qualit) без предоставленного пользователем или удаленного конструктора по умолчанию, тогда объект инициализируется нулем ..., и если T имеет нетривиальный конструктор по умолчанию, объект инициализируется по умолчанию;

std::array не имеет встроенного по умолчанию конструктора по умолчанию, поэтому он инициализируется нулем. Он имеет неявно определенный конструктор по умолчанию, но он тривиальный, поэтому он не инициализируется по умолчанию. (Но это не имеет значения, поскольку тривиальная инициализация по определению не влияет на время выполнения.)

if not, есть ли синтаксис, который будет работать на всех массивах (включая массивы нулевого размера), чтобы инициализировать все элементы до значения по умолчанию?

Матрицы C-стиля и std::array являются как агрегатами, так и полностью нулевым инициализацией любого агрегата с синтаксисом = {} . Это работает с C ++ 98. Обратите внимание, что массивы C-стиля не могут иметь нулевой размер, а sizeof (std::array< X, 0 >) не равен нулю.

Question

С C ++ 11 std::array у меня есть гарантия, что синтаксис std::array<T, N> x; будет ли по умолчанию инициализировать все элементы массива?

EDIT : если нет, существует ли синтаксис, который будет работать на всех массивах (включая массивы нулевого размера), чтобы инициализировать все элементы до их значения по умолчанию?

EDIT : в cppreference описание конструктора по умолчанию говорит:

(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array 

поэтому ответ может быть да. Но я хотел бы быть уверен в этом в соответствии со стандартным или будущим стандартом.




Прежде всего, T x [N] инициализирует элементы по умолчанию, хотя инициализация по умолчанию для скалярного типа T фактически ничего не делает. Вышеупомянутое также относится к std :: array x. Я думаю, что вам нужна инициализация списка.