• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    class template
    <type_traits>

    std::is_convertible

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

    概要

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

    要件

    Fromと型To完全型であるか、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

    処理系

    • Clang: 3.0
    • GCC: 4.3.6
    • Visual C++: 2008 (std::tr1) , 2010 , 2012 , 2013 , 2015

    関連項目

    参照