In C ++ 11 können nicht statische und nicht konstante Member in der Klasse initialisiert werden. Was hat sich geändert?

Vor C ++ 11 konnten wir die Klasseninitialisierung nur für statische const-Member vom Typ Integral oder Enumeration ausführen.Stroustrup diskutiert dies in seinen C ++ FAQmit folgendem Beispiel:

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 folgende Begründung:

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 Linker-Regeln zu vermeiden, muss in C ++ jedes Objekt eine eindeutige Definition haben. Diese Regel würde verletzt, wenn C ++ die klasseninterne Definition von Entitäten zulässt, die als Objekte im Speicher gespeichert werden müssen.

In C ++ 11 werden diese Einschränkungen jedoch gelockert, sodass nicht statische Member in der Klasse initialisiert werden können (§12.6.2 / 8):

Wenn in einem nicht delegierenden Konstruktor ein bestimmtes nicht statisches Datenelement oder eine bestimmte Basisklasse nicht durch a gekennzeichnet istmem-initializer-id (Einschließlich des Falls, in dem es keine gibtmem-initializer-liste weil der Konstruktor keine hatctor-initializer) und die Entität ist dann keine virtuelle Basisklasse einer abstrakten Klasse (10.4)

Wenn es sich bei der Entität um ein nicht statisches Datenelement handelt, für das einKlammer-oder-gleich-Initialisiererwird die Entität wie in 8.5 angegeben initialisiert;andernfalls wird keine Initialisierung durchgeführt, wenn die Entität ein Variantenmitglied (9.5) ist;Andernfalls wird die Entität standardmäßig initialisiert (8.5).

In Abschnitt 9.4.2 können auch nicht konstante statische Elemente in der Klasse initialisiert werden, wenn sie mit dem Symbol gekennzeichnet sindconstexpr Bezeichner.

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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage