最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::is_trivially_copyable(C++11)

namespace std {
  template <class T>
  struct is_trivially_copyable;
}

概要

Tがトリビアルコピー可能か調べる。

要件

remove_all_extents<T>::typeは、完全型か、const/volatile修飾された(あるいはされていない)voidでなければならない。

効果

is_trivially_copyableは、Tがトリビアルコピー可能な型であるならばtrue_typeから派生し、そうでなければfalse_typeから派生する。

「トリビアルコピー可能な型」とは、「std::memcpy()可能な型である」と言い換えることもできる。これに分類される型は、以下の全ての条件を満たす必要がある:

  • 非トリビアルなコピーコンストラクタを持っていないこと
  • 非トリビアルなムーブコンストラクタを持っていないこと
  • 非トリビアルなコピー代入演算子を持っていないこと
  • 非トリビアルなムーブ代入演算子を持っていないこと
  • トリビアルなデストラクタを持っていること

トリビアル(trivial)な特殊関数(コンストラクタ、代入演算子、デストラクタ)とは、「ユーザー定義されない特殊関数」のことを意味する。

#include <type_traits>

struct C1 {
  // 非トリビアルな特殊関数を持っていない

  // 特殊関数ではないメンバ関数は持っている
  int f(int x) const { return x; }
};

struct C2 {
  // 非トリビアルな特殊関数(デストラクタ)を持っている
  ~C2() {}
};

// 組み込み型は全てトリビアルコピー可能
static_assert(std::is_trivially_copyable<int>::value == true, "int is trivially copyable");
static_assert(std::is_trivially_copyable<int*>::value == true, "int* is trivially copyable");

// ユーザー定義型は、ユーザー定義の特殊関数を持っていなければトリビアルコピー可能
static_assert(std::is_trivially_copyable<C1>::value == true, "C1 is trivially copyable");
static_assert(std::is_trivially_copyable<C2>::value == false, "C2 isn't trivially copyable");

int main() {}

出力

バージョン

言語

  • C++11

処理系

参照

  • LWG Issue 2015. Incorrect pre-conditions for some type traits
    • C++11では要件が「型Tは完全型であるか、const/volatile修飾された(あるいはされていない)voidか、要素数不明の配列型でなければならない。」だったが、これは間違いであるため、C++14で「型remove_all_extents<T>::typeは、完全型か、const/volatile修飾された(あるいはされていない)voidでなければならない。」に変更された。