零規則

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 引入了零規則