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

履歴 編集

class template
<type_traits>

std::is_trivially_assignable(C++11)

namespace std {
  template <class T, class U>
  struct is_trivially_assignable;

  template <class T, class U>
  inline constexpr bool is_trivially_assignable_v
    = is_trivially_assignable<T, U>::value;       // C++17
}

概要

Tが型Uからトリビアルに代入可能か調べる。

要件

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

効果

is_trivially_assignableは、型Tが型Uからトリビアルに代入可能であるならばtrue_typeから派生し、そうでなければfalse_typeから派生する。

「トリビアルに代入可能」とは、ユーザー定義されない代入演算子を持っているということを意味する。

#include <type_traits>
#include <string>

struct X {
  // トリビアルな代入演算子を持っている
};

struct Y {
  // 非トリビアルな代入演算子を持っている
  Y& operator=(const Y&) { return *this; }
};

struct Z {
  // 非トリビアルな代入演算子を持つ型を包含している
  std::string s;

  // Z型は非トリビアルな代入演算子を持つ
};

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

// トリビアルな代入演算子を持っている型
static_assert(
  std::is_trivially_assignable<X&, const X&>::value == true,
  "X is trivially assignable");

// 非トリビアルな代入演算子を持っている型
static_assert(
  std::is_trivially_assignable<Y&, const Y&>::value == false,
  "Y isn't trivially assignable");

// 非トリビアルな代入演算子を持つ型を包含する型
static_assert(
  std::is_trivially_assignable<Z&, const Z&>::value == false,
  "Z isn't trivially assignable");

int main() {}

出力

バージョン

言語

  • C++11

処理系

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

参照