• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    class template
    <type_traits>

    std::is_nothrow_convertible

    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() {}
    

    出力

    バージョン

    言語

    • C++20

    処理系

    参照