Хорошо ли определено объявлять объект класса перед его статической переменной в глобальном пространстве? - PullRequest
2 голосов
/ 29 июня 2011

Ниже приведен простой случай подсчета объектов:

struct A
{
  static int count;
  A () { ++ count; }
};

Теперь его объект и static член объявлены как:

A obj;  // comes 1st
int A::count = 5;  // comes 2nd

g ++ дает ожидаемый результат.Но поскольку определение A::count идет после одного из экземпляров A в глобальном пространстве, разве это не должно быть неопределенное поведение ?

1 Ответ

2 голосов
/ 29 июня 2011

Это зависит.

3.6.2

Хранилище для объектов со статической продолжительностью хранения (basic.stc.static) должно быть инициализировано нулем (dcl.init) долюбая другая инициализация имеет место.Обнуление инициализации и инициализация с постоянным выражением вместе называются статической инициализацией;все остальные инициализации - это динамическая инициализация.Объекты типов POD (basic.types) со статической продолжительностью хранения, инициализированные с помощью константных выражений (expr.const), должны быть инициализированы перед любой динамической инициализацией.

Поскольку POD инициализирован с константойвыражении, оно будет статически инициализировано, т.е. до запуска любых конструкторов.Измените любое из этих условий, и вероятны неожиданные результаты.

...