Ответ 1
В стандарте С++ 11 порядок инициализации нелокальных переменных обсуждается в п. 6.3.2 "Инициализация нелокальных переменных".
Выполняется первая статическая инициализация , затем динамическая инициализация.
Статическая инициализация состоит из нулевой инициализации, за которой следует константа-инициализация. Нулевая инициализация - это то, на что это похоже. Константа-инициализация является новой в С++ 11, а в §3.6.2/2 указано, что она выполняла
- если каждое полное выражение (включая неявные преобразования), которое появляется в инициализаторе ссылки со статикой или длительностью хранения потоков, является постоянным выражением (5.19), и ссылка привязана к значению l, обозначающему объект со статической продолжительностью хранения или к временному (см. 12.2);
- если объект со статикой или длительностью хранилища потоков инициализируется вызовом конструктора, если конструктор является конструктором
constexpr
, если все аргументы конструктора являются постоянными выражениями (включая преобразования) и если после замены вызова функции (7.1).5), каждый вызов конструктора и полное выражение в mem-инициализаторах и в элементарных элементах для нестатических данных являются константой выражение;- если объект со статикой или длительностью хранения потока не инициализируется вызовом конструктора, и если каждое полное выражение, которое появляется в его инициализаторе, является постоянным выражением.
Итак, вторая точка - это то, где объект constexpr
потенциально инициализируется, как последняя часть статической инициализации, и, по существу, это происходит, если все constexpr
, так что оно может быть известно во время компиляции.
И да, как часть статической инициализации это происходит до динамической инициализации.