Mit Hilfe eines kostenlosen „char const *“ bei statischer Initialisierung
-
16-09-2019 - |
Frage
Initialisierung Reihenfolge der freien Objekte in C ++ nicht definiert. Aber was ist mit den folgenden?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
Ist das noch nicht definiertes Verhalten, oder gibt es eine Sondervorschrift für Zeiger mit Stringliterale initialisiert?
Abgesehen davon, dass : Was, wenn str war vom Typ "char const []"? Und wenn es ein std :: string?
Lösung 2
Die Initialisierung Reihenfolge definiert ist - sie in der Reihenfolge initialisiert werden sie in einer Übersetzungseinheit erscheinen - Abschnitt 3.6.2 der C ++ Standard-sehen. Die Art der Dinge, initialisiert wird, hat keine Wirkung.
Andere Tipps
Auch wenn sie in verschiedenen Übersetzungseinheiten befinden würden, ist die Initialisierung, um noch definiert.
Das ist, weil str
mit einem konstanten Ausdruck initialisiert (address constant expression
) und str
hat pod-Typen. Es wäre immer noch wahr halten, wenn Sie ein Array haben. Aber es wäre nicht wahr mehr, wenn Sie ein std::string
haben. Diese werden dynamisch initialisiert (weil std::string
ist ein nicht-POD).
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 aufgelistet, dass Probleme verursachen würde.