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

履歴 編集

class template
<type_traits>

std::is_nothrow_convertible(C++20)

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

  template <class From, class To>
  inline constexpr bool is_nothrow_convertible_v
    = is_nothrow_convertible<From, To>::value;
}

概要

Fromから型Toに、例外を投げずに暗黙的に変換可能か調べる。

要件

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

効果

is_nothrow_convertibleは、型Fromから型Toに、例外を投げずに暗黙的に変換可能であればtrue_typeから派生し、そうでなければfalse_typeから派生する。

備考

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

#include <type_traits>

class A {};

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

struct C {
  operator A() { return A(); }
};

struct D {
  explicit D(int) noexcept {}
};

// 組み込み型間の暗黙の型変換は、例外送出せずに行える
static_assert(std::is_nothrow_convertible_v<int, double>);
static_assert(std::is_nothrow_convertible_v<const int, double>);
static_assert(std::is_nothrow_convertible_v<int* const, int*>);

// const_castが必要
static_assert(std::is_nothrow_convertible_v<const int*, int*> == false);

static_assert(std::is_nothrow_convertible_v<const int&, long>);
static_assert(std::is_nothrow_convertible_v<int, int>);

static_assert(std::is_nothrow_convertible_v<B, A>);
static_assert(std::is_nothrow_convertible_v<C, A> == false); // 型変換演算子がnoexcept(false)

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

int main() {}

出力

バージョン

言語

  • C++20

処理系

参照