如果具有静态存储持续时间的对象的 C++ 构造函数未初始化成员,是否需要保留先前的零初始化,或者它是否使成员具有不确定的值?
我对 C++ 规范的解读是它自相矛盾。
例子:
#include <iostream>
struct Foo { Foo(); int x; } object;
Foo::Foo() { }
int main() { std::cout << object.x << std::endl; }
Foo() 构造函数没有显式初始化成员 object.x,因此根据 12.6.2 第 8 段中的注释:
该成员具有不确定的价值。
但是仔细研究各种初始化的细节,这似乎是不正确的。成员 object.x 是零初始化的,因为它具有静态存储持续时间,然后我看不到任何改变它的东西。
关于构造函数,适用的 12.6.2 中的文本是:
实体是默认初始化的。
在 8.5 第 7 段中,默认初始化的相关案例是:
... 不执行初始化
我读到这意味着默认初始化不会更改先前的零初始化。
我是否遗漏了其他一些在构造函数调用开始时将所有成员重置为“不确定值”的文本?
我在 stackoverflow 上发现了有关零初始化和默认初始化的各种其他问题,但我看不到任何分析默认初始化跟随同一实体的一些早期初始化时会发生什么的任何问题。
在这种情况下,可能没有实际效果。但是在一个更复杂的构造函数中,一些成员初始化而其他成员没有,编译器是否必须准确跟踪哪些字节/位被初始化?或者它可以只初始化整个对象(例如,将构造函数简化为 memset() 调用)?