Namespaces
Variants

Constant initialization

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

Setzt die Anfangswerte der static Variablen auf einen Compile-Time-Konstanten.

Inhaltsverzeichnis

Erklärung

Konstanteninitialisierung wird in den folgenden Fällen durchgeführt:

  • Initialisierung eines Objekts vom POD type mit static storage duration mit einem constant expression.
(bis C++11)
  • Initialisierung einer Referenz mit static oder thread storage duration, wobei alle folgenden Bedingungen erfüllt sind:
  • Jeder full-expression (einschließlich impliziter Konvertierungen), der im Initialisierer erscheint, ist ein constant expression .
  • Die Referenz ist an eine der folgenden Entitäten gebunden:
  • einen Lvalue, der ein Objekt mit static storage duration bezeichnet
  • ein temporäres Objekt
  • ein subobject eines temporären Objekts
  • eine Funktion
  • Initialisierung eines Objekts mit static oder thread storage duration, und eine der folgenden Bedingungen ist erfüllt:
  • Wenn das Objekt durch einen Konstruktoraufruf initialisiert wird, wobei der Initialisierungs-full-expression ein constant expression ist, außer dass es auch constexpr constructors für das Objekt und seine Subobjekte aufrufen darf (selbst wenn diese Objekte von nicht- literal class types sind).
  • Andernfalls ist entweder das Objekt value-initialized oder jeder full-expression, der in seinem Initialisierer erscheint, ist ein constant expression.
(seit C++11)
(bis C++17)
(seit C++17)
(bis C++20)
(seit C++20)

Die Effekte der Konstanteninitialisierung sind die gleichen wie die Effekte der entsprechenden Initialisierung, mit der Ausnahme, dass garantiert ist, dass sie abgeschlossen ist, bevor irgendeine andere Initialisierung eines statischen oder thread-lokalen (since C++11) Objekts beginnt.

Hinweise

Dem Compiler ist es erlaubt, andere statische und thread-lokale (since C++11) Objekte mittels Konstanteninitialisierung zu initialisieren, falls garantieren kann, dass der Wert derselbe wäre wie bei Befolgung der standardmäßigen Initialisierungsreihenfolge.

Konstanteninitialisierung erfolgt normalerweise, wenn das Programm in den Speicher geladen wird, als Teil der Initialisierung der Laufzeitumgebung des Programms.

Beispiel

#include <iostream>
#include <array>
struct S
{
    static const int c;
};
const int d = 10 * S::c; // kein konstanter Ausdruck: S::c hat keinen vorausgehenden
                         // Initialisierer, diese Initialisierung erfolgt nach const
const int S::c = 5;      // konstante Initialisierung, garantiert zuerst durchgeführt
int main()
{
    std::cout << "d = " << d << '\n';
    std::array<int, S::c> a1; // OK: S::c ist ein konstanter Ausdruck
//  std::array<int, d> a2;    // Fehler: d ist kein konstanter Ausdruck
}

Ausgabe:

d = 50

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 441 C++98 Referenzen konnten nicht konstant initialisiert werden konstant initialisierbar gemacht
CWG 1489 C++11 es war unklar, ob die Wertinitialisierung
eines Objekts eine konstante Initialisierung sein kann
kann sie
CWG 1747 C++11 das Binden einer Referenz an eine Funktion konnte nicht konstant initialisiert werden kann es
CWG 1834 C++11 das Binden einer Referenz an einen xvalue konnte nicht konstant initialisiert werden kann es

Siehe auch