В C++, учитывая, что const float для всего пространства имен зависит от глобального const float, гарантируется ли их порядок инициализации?

Если есть пара файлов.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;
}

в нем гарантируется, что upperLimit инициализируется после ge?

Мне известно о неопределенном порядке инициализации глобальных объектов из разных единиц перевода. Я хотел бы быть уверен, верно ли это для случая смешанных глобальных и пространственных объектов.

1 ответ

Решение

В вашем коде ge гарантированно инициализируется до upperLimit но это не имеет ничего общего с пространствами имен. Случай был бы таким же, если бы у вас не было пространства имен. Пространства имен не влияют на порядок инициализации.

Код const float ge = 2.2f; является частью постоянной инициализации, которая является частью статической инициализации, потому что это переменная со статической продолжительностью хранения, инициализируемой константным выражением.

Однако в коде const float upperLimit = 2.0f * ge;инициализатор НЕ является константным выражением, потому что значение ge не известно Так что это не статическая инициализация (и, следовательно, подпадает под динамическую инициализацию).

Вся статическая инициализация строго происходит до динамической инициализации (C++17 [basic.start.static]/2), поэтому код верен.

Другие вопросы по тегам