为什么标准决定在默认初始化期间对非类类型成员不做任何事情,但在值初始化期间执行零初始化?
如果总是对非 clss 类型的成员执行零初始化会更安全吗?
该语言设计的基本原则之一是您不应该为不需要的东西付费。如果您希望您的成员初始化,您可以要求编译器这样做,但如果您不希望这样做,成本不会强加给您。
默认初始化只会初始化那些需要初始化的东西,即具有非平凡默认构造函数的成员,因为该构造函数旨在设置一些对对象很重要的不变量。请注意,区别不是类类型与基本类型,而是是否存在平凡的构造函数:
struct POD { int a; int b; int c; };
struct V { virtual void f(); };
struct Type {
std::string str; // default initialization calls default constructor
V obj; // " calls default constructor: vptr must be set
POD pod; // default initialization leaves this untouched
};
如果您稍后要自己初始化数据,那么您不想为将内存初始化为零而只是为了将其覆盖而付费。
我从未听过 Bjarne 或其他标准委员会成员说过语言安全是 C++ 语言设计的指导原则。当然,它适用于 Java 和其他语言,但 C++ 语言设计者更倾向于效率:
C++ 精益求精。基本原则是你不用为你不使用的东西付费。
如果总是对非 clss 类型的成员执行零初始化会更安全吗?
不。
在调试配置中,使用大声抱怨的陷阱表示会更安全。不初始化值通常是更深层次问题的征兆,因此通过零初始化和继续使用不正确的数据来掩盖这一点会使问题更难诊断。