Pergunta

ordem de inicialização de objectos livres é indefinido em C ++. Mas o que sobre o seguinte?

namespace foo {
    char const* str = "hey";
    struct A {
        A() { cout << str; }
    } obj;
}

É este comportamento ainda indefinido, ou há uma disposição especial para os ponteiros inicializados com strings literais?

Afora isso : o que se str era do tipo "const char []"? E se fosse um std :: string?

Foi útil?

Solução 2

A ordem de inicialização é definido - eles são inicializados na ordem em que aparecem em uma unidade de compilação - consulte a secção 3.6.2 do padrão C ++. O tipo de coisas que estão sendo inicializado não tem efeito.

Outras dicas

Mesmo que eles seriam localizados em diferentes unidades de tradução, a ordem de inicialização está ainda definido.

Isso é porque str é inicializado com uma expressão constante (address constant expression) e str tem pod-type. Ele ainda seria verdadeiro se você tivesse um array. Mas não seria mais verdadeiro se você teve uma std::string. Aqueles são inicializadas dinamicamente (porque std::string é um não-POD).

Assim, se o seu str fosse um std::string, você seria executado em um comportamento indefinido se obj é definido em uma unidade de tradução diferente, mas esse é o único caso da pessoa que você listados que poderia causar problemas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top