В вашем коде ge
гарантированно инициализируется до upperLimit
, но это не имеет ничего общего с пространствами имен. Случай был бы таким же, если бы у вас не было пространства имен. Пространства имен не влияют на порядок инициализации.
Код const float ge = 2.2f;
является частью постоянной инициализации , которая является частью статической инициализации , поскольку это переменная со статической продолжительностью хранения, инициализируемой константным выражением.
Однако в коде const float upperLimit = 2.0f * ge;
инициализатор НЕ является константным выражением, поскольку значение ge
неизвестно. Так что это не статическая инициализация (и поэтому подпадает под динамическая инициализация ).
Вся статическая инициализация настоятельно происходит до динамической инициализации (C ++ 17 [basic.start.static] / 2), поэтому код верен.