Я ожидал, что следующий код приведет к ошибке сегментации (или иначе 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
для статической глобализации позволяет избежать фиаско статического порядка инициализации. Я не согласен, но теперь я не уверен ...