在静态初始化时使用免费的“char const *”

时间:2009-04-26 11:39:06

标签: c++ initialization-order

C ++中未定义自由对象的初始化顺序。但是下面呢?

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

这仍然是未定义的行为,还是对使用字符串文字初始化的指针有特殊规定?

除此之外:如果str的类型是“char const []”怎么办?如果它是一个std :: string?

2 个答案:

答案 0 :(得分:5)

即使它们位于不同的翻译单元中,仍然会定义初始化顺序。

这是因为str初始化为常量表达式(address constant expression)而str具有pod类型。如果你有一个数组,它仍然适用。但如果你有std::string,那就不再适用了。这些是动态初始化的(因为std::string是非POD)。

因此,如果您的strstd::string,如果在不同的翻译单元中定义obj,则会遇到未定义的行为,但这是您列出的唯一情况那会引起麻烦。

答案 1 :(得分:3)

定义初始化顺序 - 它们按照它们出现在编译单元中的顺序进行初始化 - 请参阅C ++标准的3.6.2节。被初始化的东西的类型没有效果。