Стандарт, 3.6.2, говорит, что такая инициализация должна работать, делая несколько предположений.
«Объекты типов POD (3.9) со статической продолжительностью хранения, инициализированной с помощью константных выражений (5.19), должны быть инициализированы перед любой динамической инициализацией». Поэтому присвоение 3.14 должно произойти до любой другой инициализации.
«Объекты со статической длительностью хранения, определенной в области пространства имен в одной и той же единице перевода и динамически инициализированной, должны быть инициализированы в том порядке, в котором их определение появляется в единице перевода». Поскольку pi
появляется перед div
в определении, его следует инициализировать первым.
Я предполагаю, что утверждения такие же, как вы их дали, и что TDouble
- это какая-то причудливая версия double
. Если TDouble
- класс с реальным поведением, это усложняет ситуацию. Точно так же вы не показываете контекст кода или даже указывает, является ли файл .h #include
d более чем в одном файле .c (в этом случае у вас возникнут проблемы с правилом единого определения). В качестве альтернативы, вы можете не использовать стандартный компилятор.
Итак, каково определение TDouble
? Каков контекст для строк? Какой компилятор вы используете и с какими параметрами компилятора?
Подобная инициализация не является хорошим стилем, отчасти потому, что незначительные изменения в коде или в том, как вы его используете, могут вызвать ошибки, но, насколько я могу судить, это должно сработать.