Vor C ++ 11 konnten wir nur eine In-Class-Initialisierung für statische const-Elemente vom Integral- oder Aufzählungstyp durchführen. Stroustrup erläutert dies in seinen C ++ - FAQ anhand des folgenden Beispiels:
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error: not integral
};
Und die folgenden Überlegungen:
Warum gibt es diese unbequemen Einschränkungen? Eine Klasse wird normalerweise in einer Header-Datei deklariert, und eine Header-Datei ist normalerweise in vielen Übersetzungseinheiten enthalten. Um jedoch komplizierte Linkerregeln zu vermeiden, erfordert C ++, dass jedes Objekt eine eindeutige Definition hat. Diese Regel würde verletzt, wenn C ++ die Definition von Entitäten in der Klasse zulässt, die als Objekte im Speicher gespeichert werden müssen.
In C ++ 11 werden diese Einschränkungen jedoch gelockert, sodass nicht statische Elemente in der Klasse initialisiert werden können (§12.6.2 / 8):
Wenn in einem nicht delegierenden Konstruktor ein bestimmtes nicht statisches Datenelement oder eine Basisklasse nicht durch eine mem-initializer-id gekennzeichnet ist (einschließlich des Falls, in dem keine mem-initializer-Liste vorhanden ist, weil der Konstruktor keinen ctor-initializer hat ) und die Entität ist also keine virtuelle Basisklasse einer abstrakten Klasse (10.4)
- Wenn die Entität ein nicht statisches Datenelement ist, das einen Klammer-oder-Gleich-Initialisierer hat , wird die Entität wie in 8.5 angegeben initialisiert.
- Andernfalls wird keine Initialisierung durchgeführt, wenn die Entität ein Variantenmitglied ist (9.5).
- Andernfalls wird die Entität standardmäßig initialisiert (8.5).
Abschnitt 9.4.2 ermöglicht auch die In-Class-Initialisierung von nicht konstanten statischen Elementen, wenn diese mit dem Bezeichner markiert sind constexpr
.
Was ist nun mit den Gründen für die Einschränkungen in C ++ 03 passiert? Akzeptieren wir einfach die "komplizierten Linker-Regeln" oder hat sich etwas anderes geändert, das die Implementierung erleichtert?