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

履歴 編集

class template
<type_traits>

std::is_assignable(C++11)

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

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

概要

Tが型Uから代入可能か調べる

要件

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

効果

is_assignableは、型Tが型Uから代入可能であるならばtrue_typeから派生し、そうでなければfalse_typeから派生する。

declval<T>() = declval<U>()という実際には評価されない式が適格ならば代入可能であると判断される。

#include <type_traits>

static_assert(std::is_assignable<int&, int>::value == true, "value == true, int is assignable");
static_assert(std::is_same<std::is_assignable<int&, int>::value_type, bool>::value, "value_type == bool");
static_assert(std::is_same<std::is_assignable<int&, int>::type, std::true_type>::value, "type == true_type");
static_assert(std::is_assignable<int&, int>() == true, "is_assignable<int>() == true");

static_assert(std::is_assignable<const int&, int>::value == false, "value == false, s is not assignable");
static_assert(std::is_same<std::is_assignable<const int&, int>::value_type, bool>::value, "value_type == bool");
static_assert(std::is_same<std::is_assignable<const int&, int>::type, std::false_type>::value, "type == false_type");
static_assert(std::is_assignable<const int&, int>() == false, "is_assignable<s>() == false");

static_assert(std::is_assignable<int&, double>::value == true, "int& is assignable from double");
static_assert(std::is_assignable<int&, int&>::value == true, "int& is assignable from int&");
static_assert(std::is_assignable<int&, int&&>::value == true, "int& is assignable from int&&");
static_assert(std::is_assignable<int&, const int>::value == true, "int& is assignable from const int");
static_assert(std::is_assignable<int&, volatile int>::value == true, "int& is assignable from volatile int");

static_assert(std::is_assignable<int, int>::value == false, "int is not assignable from int");
static_assert(std::is_assignable<int, int&>::value == false, "int is not assignable from int&");
static_assert(std::is_assignable<int, int&&>::value == false, "int is not assignable from int&&");
static_assert(std::is_assignable<int&&, int>::value == false, "int&& is not assignable from int");
static_assert(std::is_assignable<int&&, int&>::value == false, "int&& is not assignable from int&");
static_assert(std::is_assignable<int&&, int&&>::value == false, "int&& is not assignable from int&&");

int main(){}

出力

バージョン

言語

  • C++11

処理系

参照