使用免费的“字符常量*”在静态初始化时间
-
16-09-2019 - |
题
自由对象的初始化顺序在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
在不同的转换单元中定义,但是这是你列出了会引起麻烦的一个唯一的案例。
不隶属于 StackOverflow