零规则

Version >= C++ 11

我们可以结合五条规则和 RAII 的原则来获得更精简的界面:零规则:任何需要管理的资源都应该是自己的类型。该类型必须遵循五条规则,但该资源的所有用户不需要编写五个特殊成员函数中的任何一个,并且可以简单地知道所有这些函数。

使用 Rule of Three 示例中介绍的 Person 类,我们可以为 cstrings 创建资源管理对象:

class cstring {
private:
    char* p;

public:
    ~cstring() { delete [] p; }
    cstring(cstring const& );
    cstring(cstring&& );
    cstring& operator=(cstring const& );
    cstring& operator=(cstring&& );

    /* other members as appropriate */
};

一旦这是分开的,我们的 Person 类变得更加简单:

class Person {
    cstring name;
    int arg;

public:
    ~Person() = default;
    Person(Person const& ) = default;
    Person(Person&& ) = default;
    Person& operator=(Person const& ) = default;
    Person& operator=(Person&& ) = default;

    /* other members as appropriate */
};

Person 中的特殊成员甚至不需要明确声明; 根据 Person 的内容,编译器将默认或删除它们。因此,以下也是零规则的一个例子。

struct Person {
    cstring name;
    int arg;
};

如果 cstring 是一个仅移动类型,使用 deleted 复制构造函数/赋值运算符,则 Person 也将自动移动。

R. Martinho Fernandes 引入了零规则