2009-04-26 13 views
1

空きオブジェクトの初期化順序は、C++では未定義です。しかし、次のことはどうですか?静的初期化時にフリーの "char const *"を使用する

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

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

それ以外は:strが "char const []"タイプの場合はどうなりますか?そして、もしそれがstd :: stringだったら?

答えて

3

初期化の順序は定義されています - コンパイル単位で表示される順序で初期化されます - C++標準のセクション3.6.2を参照してください。初期化されるものの型は効果がありません。

+0

私は悪いです。 –

+1

-1:これは間違っています。 http://stackoverflow.com/questions/8750407/do-objects-of-built-in-types-have-special-static-initialisation-order-precedenceを参照してください。 –

5

異なる翻訳単位に配置されていても、初期化の順序はまだ定義されています。

これは、strが定数式(address constant expression)で初期化され、strがpodタイプであるためです。あなたが配列を持っていれば、それはまだ当てはまります。しかし、あなたがstd::stringを持っていたらそれはもう真実ではないでしょう。これらは動的に初期化されます(std::stringはPODではないため)。あなたのstrstd::stringた場合

したがって、objは異なる翻訳単位で定義されている場合は、未定義の動作に実行されますが、それはあなたがそれがトラブルの原因となる記載されている1の場合のみです。

関連する問題