C++ Attribut: indeterminate (seit C++26)
Gibt an, dass die Variable oder der Funktionsparameter einen unbestimmten Wert hat, wenn sie nicht initialisiert ist.
Inhalt |
[bearbeiten] Syntax
[[indeterminate]]
|
|||||||||
[bearbeiten] Erklärung
[[indeterminate]] kann auf die Definition einer Blockvariablen mit automatischer Speicherdauer oder auf die Deklaration eines Parameters einer Funktionsdeklaration angewendet werden. Das Attribut gibt an, dass die Bytes, aus denen sich der Speicher eines Objekts mit automatischer Speicherdauer zusammensetzt, anfänglich unbestimmt und nicht fehlerhaft sind.
Wenn ein Funktionsparameter mit [[indeterminate]] deklariert wird, muss dies in der ersten Deklaration seiner Funktion geschehen. Wenn ein Funktionsparameter in der ersten Deklaration seiner Funktion in einer Translation Unit mit [[indeterminate]] deklariert wird und dieselbe Funktion in einer anderen Translation Unit ohne [[indeterminate]] für denselben Parameter deklariert wird, ist das Programm ill-formed, no diagnostic required.
[bearbeiten] Hinweise
Das Attribut [[indeterminate]] stellt das undefinierte Verhalten wieder her, das bis C++26 implizit eingeführt wurde. Es kann dazu führen, dass Compiler einen Code-Pfad, der einen unbestimmten Wert liest, als unerreichbar betrachten.
[bearbeiten] Beispiel
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());
[bearbeiten] Referenzen
- C++26 Standard (ISO/IEC 14882:2026)
- 9.12.7 Indeterminate storage [dcl.attr.indet]