статическая или динамическая инициализация?

Правда ли, что в следующем коде, который я взял из другого вопрос, в соответствии со стандартом, статическая переменная-член 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 является динамический. Правильно ли это, а ответ на другой вопрос неверен?


person Oleksa    schedule 02.07.2021    source источник
comment
Он может выполнять оптимизацию времени ссылки или что-то подобное.   -  person M.M    schedule 02.07.2021
comment
Если w и z являются чем-то более сложным, может возникнуть фиаско статического порядка инициализации. С помощью простого компоновщика типа int это должно быть разрешено. Я бы определил отдельный constexpr и использовал его для обоих полей.   -  person Marek R    schedule 02.07.2021
comment
Во всяком случае, этот второй абзац, который вы процитировали, является излишним, поскольку он не говорит ничего, что еще не охвачено правилом «как если бы».   -  person Frank    schedule 02.07.2021
comment
Поскольку z и w находятся в разных единицах трансляции, другая единица трансляции может иметь статический инициализатор, который изменяет z, делая инициализацию w неопределенной во время компиляции и что-то, что может варьироваться от компиляции к компиляции, поскольку порядок инициализации произвольный (по компоновщик и загрузчик).   -  person Eljay    schedule 02.07.2021
comment
С чем именно вы не согласны? Оснований для разногласий вроде бы нет. Даже если компилятор не может выполнить статическую инициализацию, он все равно может это сделать.   -  person n. 1.8e9-where's-my-share m.    schedule 02.07.2021
comment
@н. 1.8e9-где-моя-доля m. Я думаю, что w должно быть 4 в любом случае. Это не может быть 0 после статической инициализации, потому что это противоречило бы статической версии инициализации создает то же значение в инициализируемой переменной, которое было бы получено динамической инициализацией, если бы все переменные, не требующие статической инициализации, были инициализируется динамически. z требуется инициализировать статически, поэтому динамическая инициализация w, которая следует за статической, должна использовать z, уже инициализированную до 4, и этот результат должен быть таким же для статической инициализации w.   -  person Oleksa    schedule 02.07.2021