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
に、例外を投げずに暗黙的に変換可能か調べる。
要件
型From
と型To
は完全型であるか、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() {}
35
static_assert(std::is_nothrow_convertible_v<C, A> == false); // 型変換演算子がnoexcept(false)
#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>);
出力
バージョン
言語
- C++20
処理系
- Clang: 9.0 ✅
- GCC: 9.1 ✅
- Visual C++: ??