Использование бесплатного "char const*" во время статической инициализации
Порядок инициализации свободных объектов не определен в 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
определяется в другом модуле перевода, но это единственный случай из перечисленного вами, который может вызвать проблемы.