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

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

0 голосов
/ 08 ноября 2018

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

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

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

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

...