Namensräume
Varianten
Aktionen

C++ Attribut: indeterminate (seit C++26)

Von cppreference.com
< cpp‎ | language‎ | attributes
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 
Attribute
(C++23)
(C++11)(bis C++26)
(C++14)
indeterminate
(C++26)
(C++20)
(C++17)
(C++11)
(C++20)
 

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]