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)
|
Gibt an, dass die Variable oder der Funktionsparameter einen unbestimmten Wert hat, wenn sie nicht initialisiert wird.
Inhaltsverzeichnis |
Syntax
[
[
indeterminate
]
]
|
|||||||||
Erklärung
[[
indeterminate
]]
kann auf die Definition einer Blockvariablen mit automatischer
Speicherdauer
oder auf eine Deklaration eines Parameters einer
Funktionsdeklaration
angewendet werden. Das Attribut spezifiziert, dass die Bytes, die den Speicher eines Objekts mit automatischer Speicherdauer umfassen, initial
indeterminiert
statt fehlerhaft sind.
Wenn ein Funktionsparameter mit
[[
indeterminate
]]
deklariert wird, muss er in der ersten Deklaration seiner Funktion deklariert werden. Wenn ein Funktionsparameter mit
[[
indeterminate
]]
in der ersten Deklaration seiner Funktion in einer Übersetzungseinheit deklariert wird und dieselbe Funktion ohne
[[
indeterminate
]]
für denselben Parameter in ihrer ersten Deklaration in einer anderen Übersetzungseinheit deklariert wird, ist das Programm
fehlerhaft, keine Diagnose erforderlich
.
Hinweise
Das
[[indeterminate]]
-Attribut stellt das undefinierte Verhalten wieder her, das bis C++26 implizit eingeführt wurde. Es könnte Compiler veranlassen, einen Code-Pfad, der einen unbestimmten Wert liest, als unerreichbar zu betrachten.
Beispiel
void f(int); void g() { int x [[indeterminate]]; // unbestimmter Wert int y; // fehlerhafter Wert f(x); // undefiniertes Verhalten f(y); // fehlerhaftes Verhalten } struct T { T() {} int x; }; void h(T a [[indeterminate]], T b) { f(a.x); // undefiniertes Verhalten beim Aufruf unten f(b.x); // fehlerhaftes Verhalten beim Aufruf unten } h(T(), T());
Referenzen
- C++26-Standard (ISO/IEC 14882:2026):
-
- 9.12.7 Unbestimmter Speicher [dcl.attr.indet]