# std::is_copy_assignable, std::is_trivially_copy_assignable, std::is_nothrow_copy_assignable

< cpp‎ | types

定义于头文件 `<type_traits>` |  |
template< class T > struct is_copy_assignable; | (1) | (C++11 起)
template< class T > struct is_trivially_copy_assignable; | (2) | (C++11 起)
template< class T > struct is_nothrow_copy_assignable; | (3) | (C++11 起)

1) 若 `T` 不是可引用类型（即可为 cv 限定的 void 或带 cv-qualifier-seq 或 ref-qualifier 的函数类型），则提供等于 false 的成员常量 `value` 。否则，提供等于 std::is_assignable<T&, const T&>::value 的成员常量 `value` 。
2) 同 (1) ，但使用 std::is_trivially_assignable<T&, const T&>
3) 同 (1) ，但使用 std::is_nothrow_assignable<T&, const T&>

`T` 应为完整类型、（可为 cv 限定的） void ，或未知边界数组。否则行为未定义。

若上述模板的实例化直接或间接地依赖于不完整类型，并且如果假如使该类型完整，实例化就会产生不同的结果，则行为未定义。

添加此页面上描述的任何模板的特化的程序行为未定义。

### 辅助变量模板

template< class T > inline constexpr bool is_copy_assignable_v = is_copy_assignable<T>::value; |  | (C++17 起)
template< class T > inline constexpr bool is_trivially_copy_assignable_v = is_trivially_copy_assignable<T>::value; |  | (C++17 起)
template< class T > inline constexpr bool is_nothrow_copy_assignable_v = is_nothrow_copy_assignable<T>::value; |  | (C++17 起)

## 继承自 std::integral_constant

### 成员常量

value [静态] | 若 `T` 可复制赋值则为 true ，否则为 false (公开静态成员常量)

### 成员函数

operator bool | 转换对象为 bool ，返回 `value` (公开成员函数)
operator() (C++14) | 返回 `value` (公开成员函数)

### 成员类型

类型 | 定义
`value_type` | `bool`
`type` | std::integral_constant<bool, value>

### 可能的实现

    template< class T>
    struct is_copy_assignable
        : std::is_assignable< typename std::add_lvalue_reference<T>::type,
                              typename std::add_lvalue_reference<const T>::type> {};

    template< class T>
    struct is_trivially_copy_assignable
        : std::is_trivially_assignable< typename std::add_lvalue_reference<T>::type,
                                        typename std::add_lvalue_reference<const T>::type> {};

    template< class T>
    struct is_nothrow_copy_assignable
        : std::is_nothrow_assignable< typename std::add_lvalue_reference<T>::type,
                                      typename std::add_lvalue_reference<const T>::type> {};

### 注解

特征 `std::is_copy_assignable` 不如可复制赋值 (CopyAssignable) 严格，因为它不检查赋值的结果类型（对于可复制赋值 (CopyAssignable) 类型必须是 `T` 类型的左值）且不检查赋值表达式保留未更改的语义要求。它亦不检查 `T` 是否满足对所有可复制赋值 (CopyAssignable) 类型要求的可移动赋值 (MoveAssignable) 。

### 示例

    #include <iostream>
    #include <utility>
    #include <type_traits>
    struct Foo { int n; };
    int main() {
        std::cout << std::boolalpha
                  << "Foo is trivally copy-assignable? "
                  << std::is_trivially_copy_assignable<Foo>::value << '\n'
                  << "int[2] is copy-assignable? "
                  << std::is_copy_assignable<int[2]>::value << '\n'
                  << "int is nothrow copy-assignable? "
                  << std::is_nothrow_copy_assignable<int>::value << '\n';
    }

输出：

    Foo is trivally copy-assignable? true
    int[2] is copy-assignable? false
    int is nothrow copy-assignable? true

### 参阅

is_assignable is_trivially_assignable is_nothrow_assignable (C++11)(C++11)(C++11) | 检查类型是否拥有针对特定实参的赋值运算符 (类模板)
is_move_assignable is_trivially_move_assignable is_nothrow_move_assignable (C++11)(C++11)(C++11) | 检查类型是否有拥有移动赋值运算符 (类模板)