Даже если они будут расположены в разных единицах перевода, порядок инициализации по-прежнему определен.
Это потому, что str
инициализируется константным выражением (address constant expression
), а str
имеет тип pod. Это было бы верно, если бы у вас был массив. Но это было бы не так, если бы у вас был std::string
. Они динамически инициализируются (потому что std::string
не является POD).
Таким образом, если бы ваш str
был std::string
, вы бы столкнулись с неопределенным поведением, если obj
определен в другой единице перевода, но это единственный случай из перечисленных вами, который может вызвать проблемы.