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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top