次のコードでセグメンテーション違反(またはUB)が発生すると予想していました。
struct T {
T();
};
T t;
char const* str = "Test string";
T::T() {
std::cout << str; // zero-initialised, only!
}
int main() {}
これは、がのt
前に初期化されるためですstr
。初期化がゼロであるためstr
、値を保持することを期待します。(char const*)0
私の解釈は[C++11: 3.6.2/2]
これをサポートしています。
ただし、上記のスニペットは期待どおりに文字列を出力しているように見えます(そして、ポインターの値も出力することで動作を確認しました)。
ここで欠落している静的初期化のルールがありますか?これにより、構築を開始str
する前に値を初期化できますか?t
標準のどこにありますか?
これは、ビルド時の静的変数の解決でchar const*
発生しました。回答者は、静的グローバルではなくを使用するとstd::string
、静的初期化順序の失敗を回避できると主張しました。同意しませんでしたが、今はよくわかりません...