Имеют ли объекты встроенных типов особый приоритет статического порядка инициализации?

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

6
задан Community 23 May 2017 в 12:09
поделиться