Использование бесплатного "char const *" во время статической инициализации - PullRequest
1 голос
/ 26 апреля 2009

Порядок инициализации свободных объектов не определен в C ++. Но как насчет следующего?

namespace foo {
    char const* str = "hey";
    struct A {
        A() { cout << str; }
    } obj;
}

Это все еще неопределенное поведение или существует специальное положение для указателей, инициализированных строковыми литералами?

Помимо этого : что если str имеет тип "char const []"? А если это был std :: string?

Ответы [ 2 ]

5 голосов
/ 26 апреля 2009

Даже если они будут расположены в разных единицах перевода, порядок инициализации по-прежнему определен.

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

Таким образом, если бы ваш str был std::string, вы бы столкнулись с неопределенным поведением, если obj определен в другой единице перевода, но это единственный случай из перечисленных вами, который может вызвать проблемы.

3 голосов
/ 26 апреля 2009

Порядок инициализации определен - они инициализируются в порядке их появления в модуле компиляции - см. Раздел 3.6.2 Стандарта C ++. Тип инициализируемых вещей не влияет.

...