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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top