C++ attribute: indeterminate (since C++26)
| 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 | ||||||||||||||||
|
||||||||||||||||
| 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 | ||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++23)
|
||||
|
(C++11)
(until C++26)
|
||||
|
(C++14)
|
||||
|
(C++17)
|
||||
|
indeterminate
(C++26)
|
||||
|
(C++20)
|
||||
|
(C++17)
|
||||
|
(C++17)
|
||||
|
(C++11)
|
||||
|
(C++20)
|
||||
|
(TM TS)
|
||||
|
(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]