为什么要将类的特殊函数显式地声明为“默认”的?

4

如何明确声明类的特殊函数和默认函数之间的区别?

class Myclass
{
public:

    Myclass() = default;
    virtual ~Myclass() = default;

    Myclass(MyClass&&) = default;
    Myclass& operator=(MyClass&&) = default;

    Myclass(const MyClass&) = default;
    Myclass& operator=(const MyClass&) = default;
};

MyClass{};

这两个声明有什么不同? 为什么要明确指定默认行为函数为默认值?

class MyClass{}; 版本没有虚析构函数。 - sp2danny
这两个声明有什么区别?哪两个声明?你似乎只包含了每个特殊成员函数的一个声明。 - underscore_d
三个原因:使读者明确,强制编译器在边缘情况下生成它们,即使它实际上不生成默认值,将默认值设为私有(以便友元类可以访问默认值)。 - arkan
1个回答

9

因为在某些情况下,即使你希望编译器生成默认的构造函数、析构函数或运算符,编译器也可能不会添加它们。然后,通过使用显式的 default 设计器,编译器仍将执行此操作。

你可以在例如这个class参考文献中了解更多信息。


4
有时候明确表达可以增加清晰度,你这样表明默认生成的选择是有意为之而不是错误。 - John Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接