Ініціалізація за замовчуванням - це термін із стандарту, який потенційно означає відсутність ініціалізації взагалі, тому ви, мабуть, маєте на увазі нульову ініціалізацію .
Опис на 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
не має наданого користувачем конструктора за замовчуванням, тому він отримує нульову ініціалізацію. Він має неявно визначений конструктор за замовчуванням, але він є тривіальним, тому він ніколи не ініціалізується за замовчуванням. (Але це не має значення, оскільки тривіальна ініціалізація за визначенням не впливає на час виконання.)
якщо ні, чи існує синтаксис, який буде працювати на всіх масивах (включаючи масиви нульового розміру) для ініціалізації всіх елементів за значенням за замовчуванням?
Масиви у стилі С std::array
є обома агрегатами, а спосіб повністю нульової ініціалізації будь-якого агрегату - це синтаксис = {}
. Це працює з C ++ 98. Зверніть увагу, що масиви у стилі С не можуть мати нульовий екстент, і sizeof (std::array< X, 0 >)
це не нуль.
T x[N]
синтаксису.