自由对象的初始化顺序在C ++未定义。但有关下列哪些?

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

这仍然是不确定的行为,或者是有特殊的规定,与字符串常量初始化的指针?

<强>除此之外:如果str是类型的 “字符常量[]” 什么?如果它是一个的std :: string?

有帮助吗?

解决方案 2

在初始化顺序定义 - 见C ++标准的第3.6.2节 - 它们是在它们出现在编译单元的顺序初始化。的东西被初始化的类型没有任何效果。

其他提示

即使他们将位于不同转换单元,在初始化顺序仍然定义。

这是因为str以恒定表达(address constant expression)和str具有荚型初始化。如果你有一个数组也仍然成立。但是,如果你有一个std::string它不会是真的了。那些被动态地初始化(因为std::string是非POD)。

因此,如果您str是一个std::string,你会碰到不确定的行为,如果obj在不同的转换单元中定义,但是这是你列出了会引起麻烦的一个唯一的案例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top