C ++中未定义自由对象的初始化顺序。但是下面呢?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
这仍然是未定义的行为,还是对使用字符串文字初始化的指针有特殊规定?
除此之外:如果str的类型是“char const []”怎么办?如果它是一个std :: string?
答案 0 :(得分:5)
即使它们位于不同的翻译单元中,仍然会定义初始化顺序。
这是因为str
初始化为常量表达式(address constant expression
)而str
具有pod类型。如果你有一个数组,它仍然适用。但如果你有std::string
,那就不再适用了。这些是动态初始化的(因为std::string
是非POD)。
因此,如果您的str
是std::string
,如果在不同的翻译单元中定义obj
,则会遇到未定义的行为,但这是您列出的唯一情况那会引起麻烦。
答案 1 :(得分:3)
定义初始化顺序 - 它们按照它们出现在编译单元中的顺序进行初始化 - 请参阅C ++标准的3.6.2节。被初始化的东西的类型没有效果。