Namespaces
Variants

C++ attribute: indeterminate (since C++26)

From cppreference.net
C++ language
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
constexpr (C++11)
consteval (C++20)
constinit (C++20)
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
Attributes
(C++23)
(C++11) (until 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 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]