命名空间
变体
操作

std::is_assignable, std::is_trivially_assignable, std::is_nothrow_assignable

来自 cppreference.cn
< cpp‎ | 类型
 
 
元编程库
类型特征
类型类别
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
(C++11)(在 C++26 中已弃用)
(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++20*)(C++17)

(C++11)
(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>() 在未求值语境中是良构的,则提供等于 true 的成员常量 value。否则,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
[静态]
如果 T 可从 U 赋值,则为 true,否则为 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

[编辑] 参见

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