C++ 零规则-未生成默认构造函数

C++ 零规则-未生成默认构造函数,c++,default-constructor,rule-of-zero,C++,Default Constructor,Rule Of Zero,我在读这篇文章: 我的理解是,如果你想拥有一个带有虚拟析构函数的基类,你需要定义所有5个特殊函数(从0的规则部分提取): class base\u共五个默认值 { 公众: 五个默认值中的基数(五个默认值中的常量基数&)=默认值; 五个默认值中的基本值(五个默认值中的基本值&)=默认值; 五个默认值中的基本值&运算符=(五个默认值中的常量基本值&)=默认值; 五个默认值中的基本值&运算符=(五个默认值中的基本值&)=默认值; virtual~base\u of_five\u defaults()=

我在读这篇文章:

我的理解是,如果你想拥有一个带有虚拟析构函数的基类,你需要定义所有5个特殊函数(从0的规则部分提取):

class base\u共五个默认值
{
公众:
五个默认值中的基数(五个默认值中的常量基数&)=默认值;
五个默认值中的基本值(五个默认值中的基本值&)=默认值;
五个默认值中的基本值&运算符=(五个默认值中的常量基本值&)=默认值;
五个默认值中的基本值&运算符=(五个默认值中的基本值&)=默认值;
virtual~base\u of_five\u defaults()=默认值;
};
但是,当我尝试安装该类时,我得到一个错误,即“未创建默认任务”:

base\u of五个默认值b;//错误
然后,如果生成默认值,则其为ok:

base\u of_five\u defaults()=默认值;
但我根本不明白这是必要的。。。所以我很困惑为什么它不在那里。我认为编译器不生成默认构造函数的唯一原因是如果您指定一个非默认构造函数

如果您确实需要指定默认的c'tor,那么示例中的类是不可构造的——这似乎很奇怪

以下是指向我的完整实时示例的链接:


发件人:

隐式声明的默认构造函数

如果没有用户声明 为类类型(struct、class、, 编译器将始终将默认构造函数声明为 其类的内联公共成员

我猜这意味着如果
base\u of theu five\u defaults(const base\u of theu five\u defaults&)=default,则认为它是用户声明的,即使它是“默认值”

我猜这意味着如果
base\u of theu five\u defaults(const base\u of theu five\u defaults&)=default,则认为它是用户声明的,即使它是“默认值”

<代码>五个默认值中的基本值(五个默认值中的基本值&)=默认值声明a1默认用户声明的构造函数

=default
使编译器生成此类构造函数的定义,但它已由用户声明

C++标准没有提供用户声明的明确定义,因此英语的意思是“用户声明”。 这就是

[class.default.ctor]/1
咬你的地方:

类X的默认构造函数是类X的构造函数,对于类X,每个不是函数参数包的参数都有一个默认参数(包括没有参数的构造函数)。
如果类X没有用户声明的构造函数,则没有参数的非显式构造函数将隐式声明为默认值([dcl.fct.def])。
隐式声明的默认构造函数是其类的内联公共成员



1) 不管它是带参数的构造函数还是不带参数的构造函数,请参见
[class.default.ctor]/1

的措辞,它的意思是用作基类(尽管这并不改变无法构造它的事实)@maximu_prime_是_463035818,但是基类可以构造,除非它特别抽象。。。但我明白你的观点——我确实觉得这个例子有点奇怪:)这个例子与“C.21:如果你定义或=删除任何复制、移动或析构函数,定义或=删除它们所有”相反,要么我遗漏了一些东西,要么他们只是遗漏了将其包含在例子中。事实上,我不知道如何将五个默认值中的
作为基础,这是作为一个真正的结果还是仅仅为了证明这一点?我倾向于后者,因为您至少定义了一个显式的构造函数,因此隐式的默认构造函数被删除了?哦,等等。我误读了C21。它实际上没有提到构造函数。一定是我遗漏了什么;)