自由对象的初始化顺序在 C++ 中是未定义的。但是下面的呢?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
这仍然是未定义的行为,还是对使用字符串文字初始化的指针有特殊规定?
除此之外:如果 str 是“char const []”类型怎么办?如果它是一个 std::string?
自由对象的初始化顺序在 C++ 中是未定义的。但是下面的呢?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
这仍然是未定义的行为,还是对使用字符串文字初始化的指针有特殊规定?
除此之外:如果 str 是“char const []”类型怎么办?如果它是一个 std::string?
即使它们位于不同的翻译单元中,初始化顺序仍然是定义的。
这是因为str
用常量表达式 ( address constant expression
) 初始化并且str
具有 pod 类型。如果你有一个数组,它仍然适用。但如果你有一个std::string
. 这些是动态初始化的(因为std::string
是非 POD)。
因此,如果您str
是 a std::string
,如果在不同的翻译单元中定义,您将遇到未定义的行为obj
,但这是您列出的唯一会导致麻烦的情况。
定义了初始化顺序 - 它们按照它们在编译单元中出现的顺序进行初始化 - 参见 C++ 标准的第 3.6.2 节。正在初始化的事物的类型没有影响。