Namespaces
Variants

C++ attribute: indeterminate (since C++26)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous
Attributes
(C++23)
(C++11) (until C++26)
(C++14)
indeterminate
(C++26)
(C++20)
(C++17)
(C++11)
(C++20)

Indica que la variable o parámetro de función tiene un valor indeterminado si no se inicializa.

Contenidos

Sintaxis

[ [ indeterminate ] ]

Explicación

[[ indeterminate ]] puede aplicarse a la definición de una variable de bloque con duración de almacenamiento automática o a una declaración de un parámetro de una declaración de función . El atributo especifica que los bytes que componen el almacenamiento de un objeto con duración de almacenamiento automática inicialmente son indeterminados en lugar de erróneos.

Si un parámetro de función se declara con [[ indeterminate ]] , debe declararse en la primera declaración de su función. Si un parámetro de función se declara con [[ indeterminate ]] en la primera declaración de su función en una unidad de traducción y la misma función se declara sin [[ indeterminate ]] en el mismo parámetro en su primera declaración en otra unidad de traducción, el programa está mal formado, no se requiere diagnóstico .

Notas

El [[indeterminate]] atributo restaura el comportamiento indefinido que fue introducido implícitamente hasta C++26. Puede hacer que los compiladores consideren inalcanzable una ruta de código que lee un valor indeterminado.

Ejemplo

void f(int);
void g()
{
    int x [[indeterminate]]; // valor indeterminado
    int y;                   // valor erróneo
    f(x); // comportamiento indefinido
    f(y); // comportamiento erróneo
}
struct T
{
    T() {}
    int x;
};
void h(T a [[indeterminate]], T b)
{
    f(a.x); // comportamiento indefinido cuando se llama abajo
    f(b.x); // comportamiento erróneo cuando se llama abajo
}
h(T(), T());

Referencias

  • Estándar C++26 (ISO/IEC 14882:2026):
  • 9.12.7 Almacenamiento indeterminado [dcl.attr.indet]