Если есть пара файлов .h / .cpp с чем-то вроде, соответственно,
extern const float ge;
а также
const float ge = 2.2f;
в них и другой файл .cpp с чем-то вроде
namespace {
const float upperLimit = 2.0f * ge;
} // namespace
bool foo(float a)
{
return a < upperLimit;
}
в нем гарантируется, что верхний предел инициализируется после GE?
Мне известно о неопределенном порядке инициализации глобальных объектов из разных единиц перевода. Я хотел бы быть уверен, верно ли это для случая смешанных глобальных и пространственных объектов.
В вашем коде ge
гарантированно инициализируется до upperLimit
но это не имеет ничего общего с пространствами имен. Случай был бы таким же, если бы у вас не было пространства имен. Пространства имен не влияют на порядок инициализации.
Код const float ge = 2.2f;
это часть постоянная инициализация, которая является частью статическая инициализация, потому что это переменная со статической продолжительностью хранения, инициализируемой константным выражением.
Однако в коде const float upperLimit = 2.0f * ge;
инициализатор НЕ является константным выражением, потому что значение ge
не известно Так что это не статическая инициализация (и, следовательно, подпадает под динамическая инициализация).
Вся статическая инициализация строго происходит до динамической инициализации (C ++ 17 [basic.start.static] / 2), поэтому код верен.
Других решений пока нет …