Usando um “const char *” livre em tempo de inicialização estática
-
16-09-2019 - |
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?
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.