首页  >  文章  >  后端开发  >  为什么私有默认构造函数会阻止 C 中的对象创建,但支撑初始化却可以工作?

为什么私有默认构造函数会阻止 C 中的对象创建,但支撑初始化却可以工作?

Patricia Arquette
Patricia Arquette原创
2024-11-12 20:39:02722浏览

Why Does a Private Default Constructor Prevent Object Creation in C   But Braced Initialization Works?

什么时候私有构造函数不是私有构造函数?

在 C 中,将构造函数设置为私有似乎是防止对象创建的直接方法课外。但是,当默认构造函数声明为私有时,会出现意外行为。

考虑以下代码:

class C {
    C() = default;
};

int main() {
    C c; // Error: Private constructor
    auto c2 = C(); // Error: Private constructor
}

令人惊讶的是,由于私有默认构造函数,此代码无法编译。然而,以下代码:

class C {
    C() = default;
};

int main() {
    C c{}; // Compiles
    auto c2 = C{}; // Compiles
}

编译成功。

这种奇怪行为的原因在于 C 标准。根据 8.4.2/5 [dcl.fct.def.default],如果函数在其第一个声明中显式默认,则该函数不是用户提供的。因此,在我们最初的示例中,默认构造函数不是用户提供的。

缺乏用户提供的构造函数使得类 C 成为按照 8.5.1/1 [dcl.init.aggr] 的聚合,其中:

  • 没有用户提供的构造函数
  • 没有私有或受保护的非静态数据成员
  • 没有基类
  • 有没有虚函数

对于聚合,花括号初始化语法被视为构造函数调用而不是声明,这就是它在后面的代码片段中成功的原因。

以上是为什么私有默认构造函数会阻止 C 中的对象创建,但支撑初始化却可以工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn