A recent question lenkte meine Aufmerksamkeit auf die Art, wie constexpr
has changed in C++14. Das neue Feature ist, dass eine nicht lokale Variable mit statischer Speicherdauer in der statischen Initialisierungsphase initialisiert werden kann, wenn ihr Initialisierer aus einem constexpr
Konstruktor besteht, selbst wenn der Typ der Variablen kein Literaltyp ist. Genauer gesagt, ist die neue Formulierung in [basic.start.init]:Zerstörungsreihenfolge von statisch initialisierten, nicht-literalen Objekten
istA Konstante initializer für ein Objekt
o
ein Ausdruck ist, dass ein konstanter Ausdruck ist, mit der Ausnahme, dass es auch constexpr Konstrukteuren füro
aufrufen kann und seine Unterobjekte, auch wenn diese Objekte nicht literale Klassen sind [Hinweis: eine solche Klasse kann einen nicht-trivialen Destruktor haben — Endnote]. Konstante Initialisierung wird ausgeführt, [...] wenn ein Objekt mit statischer oder Threadspeicherdauer durch einen Konstruktoraufruf initialisiert wird und der Initialisierungsvollausdruck ein Konstantinitialisierer für das [...] Objekt
Das typische Beispiel ist std::unique_ptr
, die „niemals schlechter sein, dass handschriftliche“:
std::unique_ptr<int> p; // statically initialized by [unique.ptr.single.ctor],
// requires no code excution
int main()
{
p = std::make_unique<int>(100);
}
// p is destroyed eventually
Vor dieser Zugabe wurde statisch initialisierten Variablen entweder von Referenztyp oder wörtlichen Objekttypen, und hatte daher trivial Destruktoren. Aber jetzt kann eine statisch initialisierte globale Variable einen nicht-trivialen Destruktor haben.
Wie wird solch ein Destruktoraufruf in Bezug auf die Destruktoren von dynamisch initialisierten globalen Objekten in Bezug auf andere statisch initialisierte Objekte angeordnet, und wie werden die Destruktoraufrufe sequenziert?
Dies ist nicht neu in C++ 14; sogar der vorherige Wortlaut lässt dies zu. ('std :: mutex' hat einen 'constexpr'-Konstruktor, so dass er zB die statische Initialisierung nutzen kann.) –
@TC .: Danke für die Klarstellung! –