Правда ли, что в следующем коде, который я взял из другого вопрос, в соответствии со стандартом, статическая переменная-член w
должна быть инициализирована динамически?
// MyClass.h:
class MyClass
{
public:
static int z;
};
// MyClass.cpp:
int MyClass::z = 4;
// MyOtherClass.h:
class MyOtherClass
{
public:
static int w;
};
// MyOtherClass.cpp:
int MyOtherClass::w = MyClass::z;
Я не согласен с принятым ответом, потому что в соответствии с формулировкой этого стандарта:
Реализации разрешено выполнять инициализацию нелокальной переменной со статической продолжительностью хранения как статическую инициализацию, даже если такая инициализация не требуется выполнять статически, при условии, что...
- статическая версия инициализации создает то же значение в инициализируемой переменной, которое было бы получено при динамической инициализации, если бы все переменные, не требующие статической инициализации, были инициализированы динамически.
Но откуда компилятору знать, какое значение будет получено при инициализации z
, если его определение недостижимо из MyOtherClass.cpp
? Если он не может знать, то условие не может быть выполнено, тогда единственным стандартным способом инициализации w
является динамический. Правильно ли это, а ответ на другой вопрос неверен?
w
иz
являются чем-то более сложным, может возникнуть фиаско статического порядка инициализации. С помощью простого компоновщика типаint
это должно быть разрешено. Я бы определил отдельныйconstexpr
и использовал его для обоих полей. - person Marek R   schedule 02.07.2021z
иw
находятся в разных единицах трансляции, другая единица трансляции может иметь статический инициализатор, который изменяетz
, делая инициализациюw
неопределенной во время компиляции и что-то, что может варьироваться от компиляции к компиляции, поскольку порядок инициализации произвольный (по компоновщик и загрузчик). - person Eljay   schedule 02.07.2021w
должно быть4
в любом случае. Это не может быть0
после статической инициализации, потому что это противоречило бы статической версии инициализации создает то же значение в инициализируемой переменной, которое было бы получено динамической инициализацией, если бы все переменные, не требующие статической инициализации, были инициализируется динамически.z
требуется инициализировать статически, поэтому динамическая инициализацияw
, которая следует за статической, должна использоватьz
, уже инициализированную до4
, и этот результат должен быть таким же для статической инициализацииw
. - person Oleksa   schedule 02.07.2021