命名空间
变体
操作

std::is_assignable、std::is_trivially_assignable、std::is_nothrow_assignable

来自 cppreference.com
< cpp‎ | types
 
 
元编程库
类型特征
类型类别
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(直到 C++20*)
(C++11)(C++20 中已弃用)
(C++11)
类型特征常量
元函数
(C++17)
支持的操作
关系和属性查询
类型修改
(C++11)(C++11)(C++11)
类型转换
(C++11)(C++23 中已弃用)
(C++11)(C++23 中已弃用)
(C++11)
(C++11)
(C++17)

(C++11)(直到 C++20*)(C++17)
编译时有理数算术
编译时整数序列
 
定义在头文件 <type_traits>
template< class T, class U >
struct is_assignable;
(1) (自 C++11 起)
template< class T, class U >
struct is_trivially_assignable;
(2) (自 C++11 起)
template< class T, class U >
struct is_nothrow_assignable;
(3) (自 C++11 起)
1) 如果表达式 std::declval<T>() = std::declval<U>() 在非求值上下文中格式良好,则提供成员常量 value 等于 true。否则,valuefalse。访问检查就像从与任一类型无关的上下文中进行一样执行。
2)(1) 相同,但赋值表达式的计算不会调用任何非平凡的操作。为了进行此检查,对 std::declval 的调用被认为是平凡的,并且不被认为是 std::declvalodr 使用
3)(1) 相同,但赋值表达式的计算不会调用任何非 noexcept 操作。

如果 TU 不是完整类型、(可能被 cv 修饰的)void 或未知边界的数组,则行为未定义。

如果上面模板的实例化直接或间接依赖于不完整类型,并且该实例化如果该类型假设完成将产生不同的结果,则行为未定义。

如果程序为本页上描述的任何模板添加了专门化,则行为未定义。

内容

[编辑] 辅助变量模板

template< class T, class U >
constexpr bool is_assignable_v = is_assignable<T, U>::value;
(自 C++17 起)
template< class T, class U >
constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::value;
(自 C++17 起)
template< class T, class U >
constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::value;
(自 C++17 起)

std::integral_constant 继承而来

成员常量

value
[静态]
true 如果 T 可从 U 赋值,否则为 false
(公共静态成员常量)

成员函数

operator bool
将对象转换为 bool,返回 value
(公共成员函数)
operator()
(C++14)
返回 value
(公共成员函数)

成员类型

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

[编辑] 备注

此特征不会检查赋值表达式立即上下文之外的任何内容:如果 TU 的使用将触发模板专门化、隐式定义的特殊成员函数的生成等,并且这些存在错误,则即使 std::is_assignable<T,U>::value 编译并计算为 true,实际赋值也可能无法编译。

[编辑] 示例

#include <iostream>
#include <string>
#include <type_traits>
 
struct Ex1 { int n; };
 
int main()
{
    std::cout << std::boolalpha
              << "int is assignable from int? "
              << std::is_assignable<int, int>::value << '\n' // 1 = 1; wouldn't compile
              << "int& is assignable from int? "
              << std::is_assignable<int&, int>::value << '\n' // int a; a = 1; works
              << "int is assignable from double? "
              << std::is_assignable<int, double>::value << '\n'
              << "int& is nothrow assignable from double? "
              << std::is_nothrow_assignable<int&, double>::value << '\n'
              << "string is assignable from double? "
              << std::is_assignable<std::string, double>::value << '\n'
              << "Ex1& is trivially assignable from const Ex1&? "
              << std::is_trivially_assignable<Ex1&, const Ex1&>::value << '\n';
}

输出

int is assignable from int? false
int& is assignable from int? true
int is assignable from double? false
int& is nothrow assignable from double? true
string is assignable from double? true
Ex1& is trivially assignable from const Ex1&? true

[编辑] 参见

检查类型是否具有复制赋值运算符
(类模板) [编辑]
检查类型是否具有移动赋值运算符
(类模板) [编辑]
指定一个类型是否可以从另一个类型赋值
(概念) [编辑]