• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    class template
    <type_traits>

    std::is_trivially_assignable

    namespace std {
      template <class T, class U>
      struct is_trivially_assignable;
    
      template <class T, class U>
      inline constexpr bool is_trivially_assignable_v
        = is_trivially_assignable<T, U>::value;       // C++17
    }
    

    概要

    Tが型Uからトリビアルに代入可能か調べる。

    要件

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

    効果

    is_trivially_assignableは、型Tが型Uからトリビアルに代入可能であるならばtrue_typeから派生し、そうでなければfalse_typeから派生する。

    「トリビアルに代入可能」とは、ユーザー定義されない代入演算子を持っているということを意味する。

    #include <type_traits>
    #include <string>
    
    struct X {
      // トリビアルな代入演算子を持っている
    };
    
    struct Y {
      // 非トリビアルな代入演算子を持っている
      Y& operator=(const Y&) { return *this; }
    };
    
    struct Z {
      // 非トリビアルな代入演算子を持つ型を包含している
      std::string s;
    
      // Z型は非トリビアルな代入演算子を持つ
    };
    
    // 組み込み型は全てトリビアルに代入可能
    static_assert(
      std::is_trivially_assignable<int&, const int&>::value == true,
      "int is trivially assignable");
    
    // トリビアルな代入演算子を持っている型
    static_assert(
      std::is_trivially_assignable<X&, const X&>::value == true,
      "X is trivially assignable");
    
    // 非トリビアルな代入演算子を持っている型
    static_assert(
      std::is_trivially_assignable<Y&, const Y&>::value == false,
      "Y isn't trivially assignable");
    
    // 非トリビアルな代入演算子を持つ型を包含する型
    static_assert(
      std::is_trivially_assignable<Z&, const Z&>::value == false,
      "Z isn't trivially assignable");
    
    int main() {}
    

    出力

    バージョン

    言語

    • C++11

    処理系

    • Clang: 3.0
    • GCC: 5.0
    • Visual C++: 2012 , 2013 , 2015
      • 2012は、is_assignable<T, U>と同一の実装になっている。

    参照