📅  最后修改于: 2023-12-03 15:14:02.946000             🧑  作者: Mango
在C++11中,引入了std::is_nothrow_move_assignable类型特征,它可以在编译时判定一个类型是否具有非抛异常移动赋值操作。
使用std::is_nothrow_move_assignable需要包含头文件<type_traits>:
#include <type_traits>
接着通过调用std::is_nothrow_move_assignable
模板类型特征来判断类型是否具有非抛异常移动赋值操作。其语法如下:
template <class T>
struct is_nothrow_move_assignable;
其中,T
是要判断的类型。该类型特征的值为true
或false
,分别表示该类型具有或没有非抛异常移动赋值操作。
下面是一个示例,展示了如何使用std::is_nothrow_move_assignable:
#include <type_traits>
#include <iostream>
class A
{
public:
A() = default;
A(A&&) noexcept {}
A& operator=(A&&) noexcept { return *this; }
};
class B
{
public:
B() = default;
B(B&&) {}
B& operator=(B&&) { return *this; }
};
int main()
{
std::cout << std::boolalpha;
std::cout << "is_nothrow_move_assignable<A>::value: "
<< std::is_nothrow_move_assignable<A>::value << '\n';
std::cout << "is_nothrow_move_assignable<B>::value: "
<< std::is_nothrow_move_assignable<B>::value << '\n';
return 0;
}
在上面的示例中,class A
和class B
分别具有和没有非抛异常移动赋值操作。运行该例程,输出结果如下:
is_nothrow_move_assignable<A>::value: true
is_nothrow_move_assignable<B>::value: false
注意,在C++11中,移动赋值操作默认不是以非抛异常方式进行的。因此,要声明一个具有非抛异常移动赋值操作的类型,需要在移动赋值运算符上显式指定noexcept
关键字。例如:
class A
{
public:
A() = default;
A(A&&) noexcept {}
A& operator=(A&&) noexcept { return *this; }
};
class B
{
public:
B() = default;
B(B&&) {}
B& operator=(B&&) noexcept(false) { return *this; }
};
对于一个类型T
,如果其非抛异常移动赋值操作无法满足一定的编译时要求,也可能导致std::is_nothrow_move_assignable<T>::value
输出false
。具体要求可参阅C++标准文档的描述。