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)
|
Indique que la variable ou le paramètre de fonction a une valeur indéterminée s'il n'est pas initialisé.
Table des matières |
Syntaxe
[
[
indeterminate
]
]
|
|||||||||
Explication
[[
indeterminate
]]
peut être appliqué à la définition d'une variable de bloc avec une
durée de stockage
automatique ou à une déclaration d'un paramètre d'une
déclaration de fonction
. L'attribut spécifie que les octets constituant le stockage d'un objet avec une durée de stockage automatique sont initialement
indéterminés
plutôt qu'erronés.
Si un paramètre de fonction est déclaré avec
[[
indeterminate
]]
, il doit être déclaré dans la première déclaration de sa fonction. Si un paramètre de fonction est déclaré avec
[[
indeterminate
]]
dans la première déclaration de sa fonction dans une unité de traduction et que la même fonction est déclarée sans
[[
indeterminate
]]
sur le même paramètre dans sa première déclaration dans une autre unité de traduction, le programme est
mal formé, aucun diagnostic requis
.
Notes
L'attribut
[[indeterminate]]
rétablit le comportement indéfini qui était implicitement introduit jusqu'au C++26. Il peut amener les compilateurs à considérer un chemin de code lisant une valeur indéterminée comme inaccessible.
Exemple
void f(int); void g() { int x [[indeterminate]]; // valeur indéterminée int y; // valeur erronée f(x); // comportement indéfini f(y); // comportement erroné } struct T { T() {} int x; }; void h(T a [[indeterminate]], T b) { f(a.x); // comportement indéfini lors de l'appel ci-dessous f(b.x); // comportement erroné lors de l'appel ci-dessous } h(T(), T());
Références
- Norme C++26 (ISO/CEI 14882:2026) :
-
- 9.12.7 Stockage indéterminé [dcl.attr.indet]