Spec-Zone.ru › C++

Атрибут 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API