В 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;
}

в нем гарантируется, что верхний предел инициализируется после GE?

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

1

Решение

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

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

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]