为什么即使 base 具有用户声明的构造函数也会发生零初始化

Why does zero-initialization happen even when base has a user-declared constructor?

本文关键字:构造函数 初始化 声明 base 用户 为什么      更新时间:2023-10-16

这打印0,这意味着data初始化为零。为什么即使base具有用户声明的构造函数也会发生这种情况?

struct base
{
    base() { }
    int data;
};
struct derived : base
{
    derived() = default;
};
int main()
{
    std::cout << derived().data;
}

如果derived有一个用户声明的构造函数,那么它会打印出一个随机值。为什么零初始化依赖于派生类而不是基类?

这些规则是专门为涵盖而编写的

struct S {
  int i;
  std::string s;
};

在没有任何用户提供的构造函数的情况下,即使隐式生成的默认构造函数不是平凡的,S().i初始化也会为零。这不能依赖于int的构造函数,因为int没有任何构造函数。决定让它取决于类S是否具有用户提供的构造函数。它没有太多可以依赖的东西。

你所看到的是一个简单的结果。您的类derived也没有用户提供的构造函数,因此它也获得零初始化。