定义于头文件
<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 起) |
value
。否则, value
为 false 。如同从与不关联到任一方的语境进行访问检查。 T
及 U
应均为完整类型、(可为 cv 限定的) void ,或未知边界数组。否则行为未定义。
目录 |
template< class T, class U >
inline constexpr bool is_assignable_v = is_assignable<T, U>::value; |
(C++17 起) | |
template< class T, class U >
inline constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::value; |
(C++17 起) | |
template< class T, class U >
inline constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::value; |
(C++17 起) | |
value
[静态]
|
若 T 可从 U 赋值则为 true ,否则为 false (公开静态成员常量) |
operator bool
|
转换对象为 bool ,返回 value (公开成员函数) |
operator()
(C++14)
|
返回 value (公开成员函数) |
类型 | 定义 |
value_type
|
bool
|
type
|
std::integral_constant<bool, value> |
此特性不检查任何赋值表达式立即语境之外的任何事物:若 T
或 U
的使用会触发模板特化,生成隐式定义的成员函数,而它们拥有错误,则实际赋值可能无法编译,即使 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
(C++11)
(C++11) (C++11) |
检查类型是否拥有复制赋值运算符 (类模板) |
(C++11)
(C++11) (C++11) |
检查类型是否有拥有移动赋值运算符 (类模板) |