• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    class template
    <type_traits>

    std::is_trivially_move_assignable

    namespace std {
      template <class T>
      struct is_trivially_move_assignable;
    
      template <class T>
      inline constexpr bool is_trivially_move_assignable_v
        = is_trivially_move_assignable<T>::value;          // C++17
    }
    

    概要

    Tがトリビアルにムーブ代入可能か調べる。

    要件

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

    効果

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

    以下の条件がtrueである場合に、トリビアルにムーブ代入可能であると見なされる:

    • C++11 : is_trivially_assignable<T&, T&&>::value == true
    • C++14 : 参照可能な型Tに対しては、is_trivially_assignable<T&, T&&>::value == trueと同じ結果となり、それ以外はfalseと見なされる。
      • 参照可能な型とは、以下のいずれかの条件に合致する型である:

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

    出力

    バージョン

    言語

    • C++11

    処理系

    備考

    Clang 3.0から3.2は、上記例のYクラスがトリビアルにムーブ代入可能と判定される。Clang 3.3から修正されている。

    参照