Статический массив статических членов: возможность инициализации порядка фиаско - PullRequest
0 голосов
/ 21 февраля 2019

Рассмотрим следующий код:

class Foo {
public:
    static const char one[];
    static const char two[];
    static const char* all[];
};

const char Foo::one[] = "one";
const char Foo::two[] = "two";
const char* Foo::all[] = {Foo::one, Foo::two};

int main()
{
    for (const auto& x: Foo::all) {
        std::cout << x << std::endl;
    }
    return 0;
}

Если работает должным образом, но я использую статические переменные (one и two) для инициализации другой статической переменной.Могу ли я столкнуться с фиаско статического порядка инициализации здесь?

Я также могу добавить constexpr ко всем объявлениям и переместить инициализацию в объявление:

class Foo {
public:
    static const constexpr char one[] = "one";
    static const constexpr char two[] = "two";
    static const constexpr char* all[] = {one, two};
};

Изменит ли это что-нибудь относительно статической инициализациизаказать фиаско?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Нет, здесь нет фиаско.Порядок инициализации статической переменной в пределах одной единицы перевода определен, и он находится в порядке их определений.

Превращение в constexpr изменит пару вещей, но не порядок инициализации.

0 голосов
/ 21 февраля 2019

Внутри одного TU указан порядок инициализации (сверху вниз), поэтому у вас нет проблем.

И даже если вы разбиты на разные TU, вы не читаете значения, поэтомубудь в порядке тоже.(например, const std::string Foo::all[] = {Foo::one, Foo::two}).

...