1

フリー オブジェクトの初期化順序は、C++ では定義されていません。しかし、次の場合はどうでしょうか。

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

これはまだ定義されていない動作ですか、それとも文字列リテラルで初期化されたポインターのための特別な規定がありますか?

それはさておき: str が "char const[]" 型だったら? それが std::string だったら?

4

2 に答える 2

5

それらが異なる翻訳単位にある場合でも、初期化順序は定義されています。

これは、strが定数式 ( address constant expression) で初期化されてstrおり、pod-type を持っているためです。配列がある場合でも、それは当てはまります。しかし、もしあなたがstd::string. これらは動的に初期化されます (std::string非 POD であるため)。

したがって、 が である場合、strが別の翻訳単位で定義されているstd::string場合、未定義の動作にobj遭遇しますが、問題を引き起こすのは、リストしたものの唯一のケースです。

于 2009-04-26T12:52:47.490 に答える
3

初期化順序が定義されています - それらはコンパイル単位に現れる順序で初期化されます - C++ 標準のセクション 3.6.2 を参照してください。初期化されるもののタイプは影響しません。

于 2009-04-26T11:40:54.557 に答える