Атрибут C++: indeterminate (начиная с C++26)
Указывает, что переменная или параметр функции имеет неопределённое значение, если он не инициализирован.
Синтаксис
[[indeterminate]] |
Пояснение
[[indeterminate]] можно применить к определению блочной переменной с автоматической длительностью хранения или к объявлению параметра в объявлении функции. Атрибут указывает, что байты, составляющие хранилище объекта с автоматической длительностью хранения, изначально имеют неопределённое, а не ошибочное значение.
Если параметр функции объявлен с [[indeterminate]], он должен быть объявлен в первом объявлении функции. Если параметр функции объявлен с [[indeterminate]] в первом объявлении функции в одной единице трансляции, а та же функция объявлена без [[indeterminate]] для того же параметра в первом объявлении в другой единице трансляции, программа является некорректно сформированной; диагностика не требуется.
Примечания
Атрибут [[indeterminate]] восстанавливает неопределённое поведение, которое неявно существовало до C++26. Он может заставить компиляторы считать недостижимым путь выполнения, при котором считывается неопределённое значение.
Пример
void f(int);
void g()
{
int x [[indeterminate]]; // indeterminate value
int y; // erroneous value
f(x); // undefined behavior
f(y); // erroneous behavior
}
struct T
{
T() {}
int x;
};
void h(T a [[indeterminate]], T b)
{
f(a.x); // undefined behavior when called below
f(b.x); // erroneous behavior when called below
}
h(T(), T());
Ссылки
- Стандарт C++26 (ISO/IEC 14882:2026):
- 9.12.7 Неопределённое хранилище [dcl.attr.indet]
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/attributes/indeterminate