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