Utilizzando un libero “const char *” in fase di inizializzazione statico
-
16-09-2019 - |
Domanda
ordine di inizializzazione degli oggetti liberi non è definito in C ++. Ma per quanto riguarda il seguente?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
È questo comportamento ancora indefinito, o c'è una disposizione speciale per i puntatori inizializzati con le stringhe?
A parte questo : e se str era di tipo "const char []"? E se fosse uno std :: string?
Soluzione 2
L'ordine di inizializzazione è definita - sono inizializzati nell'ordine in cui appaiono in un'unità di compilazione - vedere la sezione 3.6.2 della ++ standard C. Il tipo di cose essere inizializzato non ha alcun effetto.
Altri suggerimenti
Anche se sarebbero situati in diverse unità di traduzione, l'ordine di inizializzazione è ancora definito.
Questo perché str
viene inizializzato con un'espressione costante (address constant expression
) e str
ha pod-type. Sarebbe comunque tenere vero se si ha un array. Ma non sarebbe più vero se si ha un std::string
. Quelli sono dinamicamente inizializzati (perché std::string
è un non-POD).
Quindi, se il vostro str
fosse un std::string
, si esegue in un comportamento indefinito se obj
è definito in un'unità di traduzione diversa, ma questo è l'unico caso di quello che avete elencato che potrebbero causare problemi.