在C++中未定义自由对象的初始化顺序.但是下面呢?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
Run Code Online (Sandbox Code Playgroud)
这仍然是未定义的行为,还是对使用字符串文字初始化的指针有特殊规定?
除此之外:如果str是"char const []"类型怎么办?如果它是一个std :: string?
即使它们位于不同的翻译单元中,仍然定义了初始化顺序.
那是因为str用常量表达式(address constant expression)初始化并str具有pod类型.如果你有一个数组,它仍然适用.但如果你有一个,那就不再是真的了std::string.这些是动态初始化的(因为std::string它是非POD).
因此,如果您str是a std::string,如果obj在不同的翻译单元中定义,则会遇到未定义的行为,但这是您列出的唯一可能导致问题的情况.