📌  相关文章
📜  C++中的std :: is_nothrow_move_assignable(1)

📅  最后修改于: 2023-12-03 15:14:02.946000             🧑  作者: Mango

C++中的std::is_nothrow_move_assignable

在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是要判断的类型。该类型特征的值为truefalse,分别表示该类型具有或没有非抛异常移动赋值操作。

示例

下面是一个示例,展示了如何使用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 Aclass 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++标准文档的描述。