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

Другие вопросы по тегам