零规则 - 不生成默认构造函数

Rule of zero - default constructor not generated

我正在读这个:https://en.cppreference.com/w/cpp/language/rule_of_three

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

class base_of_five_defaults
{
 public:
    base_of_five_defaults(const base_of_five_defaults&) = default;
    base_of_five_defaults(base_of_five_defaults&&) = default;
    base_of_five_defaults& operator=(const base_of_five_defaults&) = default;
    base_of_five_defaults& operator=(base_of_five_defaults&&) = default;
    virtual ~base_of_five_defaults() = default;
};

然而,当我尝试设置 class 时,我收到错误消息“未创建默认 c'tor”:

    base_of_five_defaults b; // Error

然后如果我生成默认值就可以了:

base_of_five_defaults() = default;

但我根本不明白这是必需的...所以我很困惑为什么它不存在。我认为编译器不生成默认构造函数的唯一原因是如果您指定了非默认构造函数...

如果您确实需要指定默认 c'tor,那么示例中的 class 是不可构造的 - 这看起来很奇怪。

这是 link 我的完整示例:https://godbolt.org/z/qPvjd6r51


来自https://en.cppreference.com/w/cpp/language/default_constructor

Implicitly-declared default constructor

If no user-declared constructors of any kind are provided for a class type (struct, class, or union), the compiler will always declare a default constructor as an inline public member of its class.

我想这意味着如果声明了 base_of_five_defaults(const base_of_five_defaults&) = default; 那么它被认为是用户声明的,即使它是“默认的”?

I guess this means if base_of_five_defaults(const base_of_five_defaults&) = default; is declared then it is considered user-declared even though its "default"?

base_of_five_defaults(base_of_five_defaults&&) = default; 声明 a1 默认 用户声明 构造函数.

= default让编译器生成了这样一个构造函数的定义,但是已经被用户声明了

C++ 标准没有提供 user-declared 的明确定义,因此英文开始表示它的意思是,嗯,“由用户声明”。

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

[class.default.ctor]/1

A default constructor for a class X is a constructor of class X for which each parameter that is not a function parameter pack has a default argument (including the case of a constructor with no parameters).
If there is no user-declared constructor for class X, a non-explicit constructor having no parameters is implicitly declared as defaulted ([dcl.fct.def]).
An implicitly-declared default constructor is an inline public member of its class.


1)构造函数有无参数无所谓,见[class.default.ctor]/1.

的写法