为什么 C++ 默认初始化不会对非类类型成员进行零初始化

swa*_*ang 1 c++ initialization

为什么标准决定在默认初始化期间不对非类类型成员执行任何操作,但在值初始化期间执行初始化

如果总是对非类类型成员执行零初始化会更安全吗?

Dav*_*eas 5

该语言设计的基本原则之一是,您不应该为不需要的东西付费。如果您希望您的成员初始化,您可以要求编译器这样做,但如果您不希望那样,成本不会强加给您。

默认初始化只会初始化那些需要初始化的东西,即具有非平凡默认构造函数的成员,因为该构造函数旨在设置一些对对象很重要的不变量。请注意,区别不是类类型与基本类型,而是是否存在平凡的构造函数:

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
};
Run Code Online (Sandbox Code Playgroud)