我需要遵守五人规则吗?

问题描述 投票:0回答:2

那么https://en.cppreference.com/w/cpp/language/rule_of_ Three它说:

由于用户定义的(或=默认或=删除声明)析构函数、复制构造函数或复制赋值运算符的存在阻止了移动构造函数和移动赋值运算符的隐式定义,因此任何需要移动语义的类,必须声明所有五个特殊成员函数

因此,对于这堂课,我做了以下工作

#include <string>
#include <iostream>

class Data {
private:
    std::string m_name;

public:
    Data() { m_name = "stackman"; }
    ~Data() = default;
    Data(const Data&) = delete;
    Data& operator=(const Data&) = delete;
    Data(Data&&) = delete;
    Data& operator=(Data&&) = delete;

    std::string get_name() { return m_name; }
};

int main()
{
    Data person;

    std::cout << person.get_name() << std::endl;

}

我在网上看到有冲突的资源说,如果析构函数设置为默认值,并且如果您不需要其他构造函数,则不需要删除或定义它们。那么最好的做法是什么?

c++ rule-of-five
2个回答
0
投票

如果您打算默认析构函数,并且不打算显式地使类不可移动或不可复制,那么您根本不应该声明析构函数。这样做没有任何好处。遵循零规则并且根本不声明任何特殊成员函数。

在某些情况下,您需要显式地默认析构函数,特别是如果您想将其声明为

virtual
,但在其他情况下,请使其表现得像隐式析构函数。问题是这会禁用移动操作的隐式声明。因此,您应该再次假设您不想故意禁用移动或复制操作,明确默认所有特殊成员函数。如果默认实现不起作用,它们仍将被定义为已删除。这也符合你引用的五法则。

如果您在非模板类中执行此操作,编译器可能会警告您默认成员函数将被删除(如果发生这种情况)。在这种情况下,您可以删除或删除有问题的成员函数来消除警告。

如果您确实打算显式使类不可复制或不可移动,则删除相关的特殊成员函数并默认其余部分。


0
投票

您提供的3链接规则也讨论了0规则。 0 规则优先于 5 规则。它还讨论了 0 规则如何成为C++ 核心标准的一部分。

如果您只是为了添加析构函数而添加析构函数,请重新考虑应用 0 规则。如果您试图停止移动/复制能力,那么您已经遵循了此处的 5 规则,并且应该继续。

© www.soinside.com 2019 - 2024. All rights reserved.