A recent question ha attirato la mia attenzione sul modo in cui constexpr
has changed in C++14. La nuova funzionalità è che una variabile non locale con durata di memorizzazione statica può essere inizializzata nella fase di inizializzazione statica se il suo inizializzatore è costituito da un costruttore constexpr
, anche se il tipo della variabile non è un tipo letterale. Più precisamente, la nuova formulazione [basic.start.init] è:Ordine di distruzione di oggetti non letterali inizializzati staticamente
Un costante inizializzatore per un oggetto
o
è un'espressione che è un'espressione costante, eccetto che può anche invocare costruttori constexpr pero
e i suoi sottooggetti anche se tali oggetti sono di tipo non letterale [Nota: tale classe può avere un distruttore non banale nota finale]. costante inizializzazione viene eseguita [...] se un oggetto con durata statica o stoccaggio filo viene inizializzato da una chiamata di un costruttore, e se l'inizializzazione completa espressione è un inizializzatore costante per l'oggetto [...]
L'esempio tipico è std::unique_ptr
, che "non dovrebbe mai essere peggio che scritto a mano":
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
Prima di questa aggiunta, le variabili inizializzate staticamente erano o di tipo di riferimento o di tipo di oggetto letterale, e quindi aveva banale distruttori. Ma ora una variabile globale inizializzata staticamente può avere un distruttore non banale.
Come viene ordinata una tale chiamata del distruttore rispetto ai distruttori di oggetti globali inizializzati dinamicamente, rispetto ad altri oggetti inizializzati staticamente, e come vengono sequenziate le chiamate del distruttore?
Questo non è nuovo per C++ 14; anche la formulazione precedente lo consente. ('std :: mutex' ha un costruttore' constexpr' in modo che possa sfruttare l'inizializzazione statica, per esempio.) –
@ T.C .: Grazie per il chiarimento! –