Использование свободного “char const*” во время статической инициализации

StackOverflow https://stackoverflow.com/questions/790687

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top