Использование свободного “char const*” во время статической инициализации
-
16-09-2019 - |
Вопрос
Порядок инициализации свободных объектов в C ++ не определен.Но как насчет следующего?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
Является ли это все еще неопределенным поведением, или существует специальное положение для указателей, инициализированных строковыми литералами?
Помимо этого:что, если бы str был типа "char const[]"?А если бы это был std::string?
Решение 2
Порядок инициализации определен - они инициализируются в том порядке, в каком они отображаются в модуле компиляции - см. Раздел 3.6.2 стандарта C ++.Тип инициализируемых объектов не имеет никакого эффекта.
Другие советы
Даже если они будут расположены в разных единицах перевода, порядок инициализации все равно будет определен.
Это потому, что str
инициализируется постоянным выражением (address constant expression
) и str
имеет стручковый тип.Это все равно оставалось бы верным, если бы у вас был массив.Но это больше не было бы правдой, если бы у вас был std::string
.Они динамически инициализируются (потому что std::string
является не-POD).
Таким образом, если ваш str
были std::string
, вы столкнулись бы с неопределенным поведением , если obj
определяется в другой единице перевода, но это единственный случай из перечисленных вами, который может вызвать проблемы.