Гарантируется ли инициализация статического объекта

Я пытаюсь узнать об инициализации статических объектов. Статическая инициализация кажется довольно простой, если вы понимаете постоянные выражения иconstexpr, Динамическая инициализация кажется немного более сложной.

[Basic.start.init] / 4

Определяется реализацией, выполняется ли динамическая инициализация нелокальной переменной со статической длительностью хранения перед первым оператором main. Если инициализация откладывается до некоторого момента времени после первого оператора main, это должно произойти до первого использования (3.2) какой-либо функции или переменной, определенной в той же единице преобразования, что и для инициализируемой переменной.

сноска 34

Нелокальная переменная со статической продолжительностью хранения, имеющая инициализацию с побочными эффектами, должна быть инициализирована, даже если она не используется odr (3.2, 3.7.1).

[Basic.start.init] / 5

Определяется реализацией, выполняется ли динамическая инициализация нелокальной переменной со статической или продолжительностью хранения потока перед первым оператором начальной функции потока. Если инициализация откладывается до некоторого момента времени после первого оператора начальной функции потока, она должна произойти до первого использования odr (3.2) любой переменной с продолжительностью хранения потока, определенной в той же единице перевода, что и переменная быть инициализированным.

Я предполагаю, что «начальная функция потока» относится к main, а не только к потокам, запущенным с std :: thread.

h1.h

#ifndef H1_H_
#define H1_H_

extern int count;

#endif

tu1.cpp

#include "h1.h"

struct S
{
   S()
   {
      ++count;
   }
};

S s;

tu2.cpp

#include "h1.h"

int main(int argc, char *argv[])
{
   return count;
}

tu3.cpp

#include "h1.h"

int count;

Таким образом, если компилятор откладывает динамическую инициализацию, кажется, что в сноске 34 говорится, чтоs должен быть инициализирован в какой-то момент. Поскольку в модуле трансляции нет других переменных с динамической инициализацией, нет никакой другой переменной, которую можно использовать в odr для принудительной инициализации переменных в tu1. В какой моментs гарантированно были инициализированы?

Main гарантированно вернет 1? Кроме того, есть ли способ изменить эту программу так, чтобы она больше не гарантировала возврат 1? В качестве альтернативы, если это не гарантировано, есть ли способ изменить эту программу так, чтобы она стала гарантированной?

Я разбил код так, чтобы определениеs находится в другой единице перевода изmain, Это позволяет избежать вопроса о том,main используется одр. Учитывая этоs является единственным объектом в блоке перевода, гарантируется ли, чтоmain вернет 1?

Ответы на вопрос(3)

Ваш ответ на вопрос