最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::is_convertible(C++11)

namespace std {
  template <class From, class To>
  struct is_convertible;

  template <class From, class To>
  constexpr bool is_convertible_v
    = is_convertible<From, To>::value; // C++17
}

概要

Fromから型Toに、暗黙的に変換可能か調べる。

要件

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

効果

is_convertibleは、型Fromから型Toに暗黙的に変換可能であればtrue_typeから派生し、そうでなければfalse_typeから派生する。

備考

return文による型変換、および非explicitなコンストラクタによる型変換は、暗黙的に変換可能であるとみなされる。explicitなコンストラクタによる明示的な型変換は、暗黙的に変換可能であるとは見なされない。

#include <type_traits>

class A {};
struct B {
  operator A() { return A(); }
};

struct C {
  explicit C(int) {}
};

static_assert(std::is_convertible<int, double>::value == true, "int convertible to double");
static_assert(std::is_convertible<const int, double>::value == true, "const int convertible to double");
static_assert(std::is_convertible<int* const, int*>::value == true, "int* const convertible to int*");

// const_castが必要
static_assert(std::is_convertible<const int*, int*>::value == false, "int const* not convertible to int*");

static_assert(std::is_convertible<const int&, long>::value == true, "const int& convertible to long");
static_assert(std::is_convertible<int, int>::value == true, "int convertible to int");

static_assert(std::is_convertible<B, A>::value == true, "B convertible to A");

// explicitなコンストラクタによる明示的な型変換は、変換可能とみなされない
static_assert(std::is_convertible<int, C>::value == false, "int not convertible to C");

int main() {}

出力

バージョン

言語

  • C++11

処理系

参照