C++ 隐式创建的构造函数,析构函数存在的条件
2018-10-22 本文已影响0人
KinoluKaslana
概述:对于classes(包含class,struct,union)的隐式创建的构造函数的存在条件整理:
额外概念:子对象,即:作为[虚]基类,或非静态数据成员
- 1通用原则:
- 如果存在非静态的const数据成员或引用,并且没有为该成员指定默认成员初始化器(注,可以用户定义默认构造函数,则该构造函数必须使用列表初始化,以初始化该类型的成员),则当前类的隐式默认构造函数默认删除
- 如果[基类]子对象析构函数为删除或不可访问,则当前类的隐式默认构造函数也默认删除
- 如果[基类]子对象的默认构造函数被删除或不可访问或有歧义,则当前类的隐式默认构造函数默认删除
- 当一个匿名union在一个classes中,且该匿名union的变体成员不具有默认构造函数,则当前classes的隐式默认构造函数默认删除
- 对于union,则有更加特殊的:
- 对于非静态数据成员,且该成员是聚类并且默认构造函数非平凡或删除,初非该成员有一个默认成员初始化序列(注意,union中,默认成员初始化只允许有一个),否则当前union的隐式默认构造函数默认删除
- union中所有的非静态成员均为const