什么时候私有构造函数不是私有构造函数?
在 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中文网其他相关文章!