我在读这个:https ://en.cppreference.com/w/cpp/language/rule_of_three
我对此的理解是,如果你想拥有一个带有虚拟析构函数的基类,你需要定义所有 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;
};
但是,当我尝试创建该类时,我收到错误消息,提示“未创建默认 c'tor”:
base_of_five_defaults b; // Error
然后,如果我生成默认值就可以了:
base_of_five_defaults() = default;
但我根本不明白这是需要的......所以我很困惑为什么它不在那里。我认为编译器不生成默认构造函数的唯一原因是如果您指定了非默认构造函数......
如果您确实需要指定默认 c'tor,那么示例中的类是不可构造的 - 这看起来很奇怪。
这是我的完整示例的链接:https ://godbolt.org/z/qPvjd6r51
从https://en.cppreference.com/w/cpp/language/default_constructor:
隐式声明的默认构造函数
如果没有为类类型(结构、类或联合)提供任何类型的用户声明的构造函数,编译器将始终将默认构造函数声明为其类的内联公共成员。
我想这意味着如果base_of_five_defaults(const base_of_five_defaults&) = default;
声明了,那么即使它的“默认”也被认为是用户声明的?