Информация об изменениях

Сообщение Re: Локальные переменные от 17.08.2025 8:58

Изменено 17.08.2025 9:02 rg45

Re: Локальные переменные
Здравствуйте, LaptevVV, Вы писали:

LVV>Вопрос: в с++20 локальные переменные стали зануляться по стандарту ?

LVV>Помнится вроде в clang они давно занулялись.
LVV>Сейчас стали обнуляться и в gcc.
LVV>В n4868 в 9.4 написано только
LVV>To zero-initialize an object or reference of type T means:
LVV>(6.1) — if T is a scalar type (6.8), the object is initialized to the value obtained by converting the integer literal 0 (zero) to T;
LVV>Относится ли это к локальным переменным — непонятно.

В этом пункте расписано, что из себя представляет zero-initialization, а не когда она применяется. А чтоб отследить, когда она применяется, там нужно отслеживать целую цепочку пунктов, и заканчивается эта цепочка вот здесь: https://timsong-cpp.github.io/cppwp/dcl.init.general#7.4

(7.3) — Otherwise, no initialization is performed.


Как подкрепление сказанному, практический пример (С++26):

http://coliru.stacked-crooked.com/a/2b259fe0bb7256ac

#include <iostream>

int x;

int main() {
    int y;
    std::cout << x << std::endl;    // OK
    std::cout << y << std::endl;    // warning: 'y' is used uninitialized [-Wuninitialized]
}


А то, что в каком-то конкретном случае неинициализированная переменная содержит нули, следует списать просто на стечение остоятельсв, я думаю.
Re: Локальные переменные
Здравствуйте, LaptevVV, Вы писали:

LVV>Вопрос: в с++20 локальные переменные стали зануляться по стандарту ?

LVV>Помнится вроде в clang они давно занулялись.
LVV>Сейчас стали обнуляться и в gcc.
LVV>В n4868 в 9.4 написано только
LVV>To zero-initialize an object or reference of type T means:
LVV>(6.1) — if T is a scalar type (6.8), the object is initialized to the value obtained by converting the integer literal 0 (zero) to T;
LVV>Относится ли это к локальным переменным — непонятно.

В этом пункте расписано, что из себя представляет zero-initialization, а не когда она применяется. А чтоб отследить использование, там нужно отслеживать целую цепочку пунктов, и заканчивается эта цепочка вот здесь: https://timsong-cpp.github.io/cppwp/dcl.init.general#7.4

(7.3) — Otherwise, no initialization is performed.


А то, что в каком-то конкретном случае неинициализированная переменная содержит нули, следует списать просто на стечение обстоятельсв, я думаю.

Как подкрепление сказанному, практический пример (С++26):

http://coliru.stacked-crooked.com/a/2b259fe0bb7256ac

#include <iostream>

int x;

int main() {
    int y;
    std::cout << x << std::endl;    // OK
    std::cout << y << std::endl;    // warning: 'y' is used uninitialized [-Wuninitialized]
}