Сообщение Re: Локальные переменные от 17.08.2025 8:58
Изменено 17.08.2025 9:43 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
В общем, принципиальных изменений не наблюдается. А то, что в каком-то конкретном случае неинициализированная переменная содержит нули, следует списать просто на стечение обстоятельсв, я думаю.
Как подкрепление сказанному, практический пример (С++26):
http://coliru.stacked-crooked.com/a/2b259fe0bb7256ac
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
Наиболее интересным в данном контексте является, пожалуй, вот этот пункт:
https://timsong-cpp.github.io/cppwp/n4861/basic.indet#1
В общем, принципиальных изменений не наблюдается. А то, что в каком-то конкретном случае неинициализированная переменная содержит нули, следует списать просто на стечение обстоятельсв, я думаю.
Как подкрепление сказанному, практический пример (С++26):
http://coliru.stacked-crooked.com/a/2b259fe0bb7256ac
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.
Наиболее интересным в данном контексте является, пожалуй, вот этот пункт:
https://timsong-cpp.github.io/cppwp/n4861/basic.indet#1
6.7.4 Indeterminate values
1 When storage for an object with automatic or dynamic storage duration is obtained, the object has an indeterminate value, and if no initialization is performed for the object, that object retains an indeterminate value until that value is replaced ([expr.ass]). [ Note: Objects with static or thread storage duration are zero-initialized, see [basic.start.static]. — end note]
В общем, принципиальных изменений не наблюдается. А то, что в каком-то конкретном случае неинициализированная переменная содержит нули, следует списать просто на стечение обстоятельсв, я думаю.
Как подкрепление сказанному, практический пример (С++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]
}