Що дає ініціалізація масиву одним елементом stack overflow російською

Є така ланцюжок з цитат зі стандарту C ++, які пояснюють, як не започатковано елементи масиву при ініціалізації масиву виду

Перше, на що слід звернути увагу, це те, що масиви відносяться до агрегатних типів. Тому звертаємося до розділу, де описана ініціалізація агрегатних типів 8.5.1 Aggregates:

7 If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be initialized from its brace-or-equalinitializer or, if there is no brace-or-equalinitializer, from an empty initializer list (8.5.4).

Ця витримка з стандарту говорить про те, що якщо ініціалізаторів менше, ніж елементів в масиві, то елементи масиву, які не мають явного ініціалізатор инициализируются нібито вказані порожні фігурні дужки для кожного елемента. Тобто це можна представити таким чином

Тепер звернемося до стандарту за роз'ясненням, що означає, коли є порожні фігурні дужки. У параграфі №3 розділу 8.5.4 List-initialization, написано

- Otherwise, if the initializer list has no elements, the object is value-initialized

А що означає value-initialized. Про це написано в розділі 8.5 Initializers стандарту

8 To value-initialize an object of type T means:

- otherwise, the object is zero-initialized.

І, нарешті, поняття zero-initialized означає (8.5 Initializers)

6 To zero-initialize an object or reference of type T means:

- if T is a scalar type (3.9), the object is initialized to the value obtained by converting the integer literal 0 (zero) to T;

Тобто всі елементи масиву, яким не були задані явно ініціалізатор, инициализируются нулем. Тому в підсумку цей запис

еквівалентна наступній записи:

І, в результаті, отримуємо, що запис

Майте на увазі, що в мові C дві останні записи не еквівалентні. Для мови C запис

помилкова, і компілятор видасть повідомлення про помилку.

Схожі статті