私有构造函数与统一初始化的异常行为求解(VC19+C++17)
私有构造函数与统一初始化的行为差异解释
Obj o;触发默认初始化,会尝试调用类的默认构造函数,但你将Obj()声明为私有,外部无法访问,因此编译报错符合预期。Obj o{10};触发聚合初始化,而非调用构造函数,这是核心原因:
根据C++17标准,Obj属于聚合类型,判定依据如下:- 类中没有用户提供的构造函数——你声明的
Obj() = default;属于用户声明但非用户提供的构造函数,不影响聚合类型的判定; - 非静态数据成员
a是公有的; - 类没有基类、虚函数等不符合聚合类型的特征。
聚合初始化会直接对类的公有非静态数据成员进行初始化,完全不需要调用任何构造函数,因此私有默认构造函数的访问限制不会对其产生影响,编译可以正常通过。
- 类中没有用户提供的构造函数——你声明的
注:该行为符合C++17标准,你使用的VC19(MSVC 2019)正确实现了这一规则。
内容的提问来源于stack exchange,提问作者Gian
相关产品推荐
相关产品推荐

