1

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

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

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

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

4

2 回答 2

5

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

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

因此,如果您str是 a std::string,如果在不同的翻译单元中定义,您将遇到未定义的行为obj,但这是您列出的唯一会导致麻烦的情况。

于 2009-04-26T12:52:47.490 回答
3

定义了初始化顺序 - 它们按照它们在编译单元中出现的顺序进行初始化 - 参见 C++ 标准的第 3.6.2 节。正在初始化的事物的类型没有影响。

于 2009-04-26T11:40:54.557 回答