C++と色々

主にC++やプログラムに関する記事を投稿します。

trivial class

trivial class

wikipediaの定義によると、

trivial なクラス・構造体は、以下のように定義される。
コンパイラ定義のデフォルトコンストラクタを持つ。コンストラクタの default 指定の記法を用いてよい (SomeConstructor() = default;)。
コンパイラ定義のコピーコンストラクタを持つ。default 記法を用いてよい。
コンパイラ定義の代入演算子を持つ。default 記法を用いてよい。
コンパイラ定義で、非 virtual のデストラクタを持つ。

と書かれています。

//trivial class : ユーザー定義のコンストラクタ、コピーコンストラクタ
//ムーブコンストラクタ、コピー代入演算子、ムーブ代入演算子、デストラクタを定義していない
class trivial
{
public:
    void disp(){std::cout << a << std::endl;}

private:
    int a;
};

//non trivial class : コンストラクタが定義されている
class non_trivial
{
public:
    non_trivial(){}
    void disp(){std::cout << a << std::endl;}

private:
    int a;
};

trivially copyable class

これはユーザー定義したコピーコンストラクタ、ムーブコンストラクタ、コピー代入演算子、ムーブ代入演算子、デストラクタがないクラス。つまりコンストラクタだけはユーザ定義可能で、その他の自動生成される関数はコンパイラ定義なクラスということ。なので上記の例のnon_trivial型はtrivial classではないが、trivially copyable classと言える。

それぞれのユーザー定義せずコンパイラ定義された関数をtrivial constructor、trivial destructor、(以下略)と言う。
デストラクタは非virtualでなければならない。コピーコンストラクタ、ムーブコンストラクタがtrivialであるためには仮想関数、仮想基本クラスを持っていてはならない。

おまけ

以前POD型についての日記を書いたけど、C++11のPOD型の定義はtrivial classであり、かつstandard-layout classであり、かつ全ての非staticメンバがPOD型の時、POD型と定義される。
standard_layoutの説明は今回は省略する。知りたい人は本の虫さんの記事本の虫: C++0xにおけるPODの定義wikipediaC++11 - Wikipediaを見ると良いと思います!