最終更新日時(UTC):
が更新

履歴 編集

class template
<type_traits>

std::is_trivially_constructible(C++11)

namespace std {
  template <class T, class... Args>
  struct is_trivially_constructible;

  template <class T, class... Args>
  inline constexpr bool is_trivially_constructible_v
    = is_trivially_constructible<T, Args...>::value; // C++17
}

概要

Tがトリビアルに構築可能か調べる。T( Args... ) の形式のコンストラクタ呼び出しがトリビアルに可能であるか。

要件

Tおよび、Args...の全ての型は、完全型であるか、const/volatile修飾された(あるいはされていない)voidか、要素数不明の配列型でなければならない。

効果

is_trivially_constructibleは、T( Args... )の形式のコンストラクタ呼出しがトリビアルに可能であるならばtrue_typeから派生し、そうでなければfalse_typeから派生する。

「トリビアルに構築可能」とは、ユーザー定義されないコンストラクタを持っていることを意味する。

#include <type_traits>
#include <string>

struct X {
  // トリビアルなコンストラクタを持っている
};

struct Y {
  // 非トリビアルなコピーコンストラクタを持っている
  Y(const Y&) {}
};

struct Z {
  // 非トリビアルなコピーコンストラクタを持つ型を包含している
  std::string s;

  // Z型は非トリビアルなコピーコンストラクタを持つ
};

// 組み込み型は全てトリビアルに構築可能
static_assert(
  std::is_trivially_constructible<int, const int&>::value == true,
  "int is trivially constructible");

// トリビアルなコンストラクタを持っている型
static_assert(
  std::is_trivially_constructible<X, const X&>::value == true,
  "X is trivially constructible");

// 非トリビアルなコンストラクタを持っている型
static_assert(
  std::is_trivially_constructible<Y, const Y&>::value == false,
  "Y isn't trivially constructible");

// 非トリビアルなコンストラクタを持つ型を包含する型
static_assert(
  std::is_trivially_constructible<Z, const Z&>::value == false,
  "Z isn't trivially constructible");

int main() {}

出力

バージョン

言語

  • C++11

処理系

  • Clang: 3.0
  • GCC: 5.0
  • Visual C++: 2012, 2013, 2015
    • 2012は、is_constructible<T, Args...>と同一の実装になっている。

参照