Нет никакой гарантии, что какой-либо из двух статически инициализируется перед выполнением любого кода времени выполнения.Во-первых, это легко сделать, хотя
class One{
public:
int adad1;
int adad2;
};
// initialized statically, if a and b are constant-expressions
One one = { a, b };
Как говорит другой парень, constexpr
в C ++ 0x позволяет конструкторам выполняться статически.В вашем случае это будет работать для первого случая, но не для второго.Во-вторых, вам придется жить так, что Стандарт не дает никаких гарантий.Но стандарт все же позволяет реализации оптимизировать его на этапе статической инициализации.См. 3.6.2 / 2
Реализация может выполнять инициализацию объекта области пространства имен со статической продолжительностью хранения в качестве статической инициализации, даже если такая инициализация не требуется выполнять статически, при условиичто
- динамическая версия инициализации не изменяет значение любого другого объекта области пространства имен со статической продолжительностью хранения до его инициализации, а
- статическая версия инициализациивыдает то же значение в инициализированном объекте, что и динамическая инициализация, если все объекты, которые не требуется статически инициализировать, динамически инициализируются.
Если данный массив подходит, ваш конструкторне может нарушать эти правила.Стандарт показывает пример, который я объяснил в более подробно здесь .Для завершения пример кода показан ниже
inline double fd() { return 1.0; }
extern double d1;
double d2 = d1; // unspecified:
// may be statically initialized to 0.0 or
// dynamically initialized to 1.0
double d1 = fd(); // may be initialized statically to 1.0
Как видите, размещение объектов, которые должны быть инициализированы ранее, может даже идти с измененными начальными значениями, если существует определенная связь между переменными.