2009-04-26 7 views
1

Die Initialisierungsreihenfolge freier Objekte ist in C++ nicht definiert. Aber was ist mit dem Folgenden?Verwendung eines freien "char const *" zur statischen Initialisierungszeit

Ist dies noch undefiniertes Verhalten, oder gibt es eine spezielle Vorkehrung für Zeiger, die mit String-Literalen initialisiert werden?

Abgesehen davon: Was wäre, wenn str vom Typ "char const []" wäre? Und wenn es eine std :: string wäre?

Antwort

3

Die Initialisierungsreihenfolge ist definiert - sie werden in der Reihenfolge initialisiert, in der sie in einer Kompilierungseinheit erscheinen - siehe Abschnitt 3.6.2 des C++ Standards. Die Art der Dinge, die initialisiert werden, hat keine Auswirkung.

+0

Ich sehe, mein schlechtes. –

+1

-1: Das ist falsch. Siehe http://stackoverflow.com/questions/8750407/do-objects-of-built-in-types-have-special-static-initialization-order-precedence –

5

Auch wenn sie sich in verschiedenen Übersetzungseinheiten befinden würden, ist die Initialisierungsreihenfolge immer noch definiert.

Das ist, weil str mit einem konstanten Ausdruck (address constant expression) initialisiert wird und str Pod-Typ hat. Es würde immer noch wahr sein, wenn Sie ein Array hätten. Aber es wäre nicht mehr wahr, wenn Sie eine std::string hätten. Diese werden dynamisch initialisiert (weil std::string ein Nicht-POD ist).

Wenn also Ihre str ein std::string, würden Sie in undefiniertes Verhalten führen, wenn obj in einer anderen Übersetzungseinheit definiert ist, aber das ist der einzige Fall, der einer Du, dass aufgeführten Probleme verursachen würde.