C++中移动构造函数为什么需要加noexcept

noexcept关键字修饰的函数不会在执行过程中抛出异常。如果标记为noexcept的函数抛出异常,那么编译器会调用std::terminate()函数中断程序执行。

1.void func() noexcept;

2.为noexcept额外提供一个常量表达式作为其参数,true函数被标记为不抛出异常

  constexpr bool suppressExcept = true;

  void fun() noexcept (suppressExcept);

C++11类结构隐式自动声明的和程序员主动声明的不带任何修饰符的函数都是默认noexcept(true)的

移动构造函数可以在对象进行赋值的时候直接移动原对象已经分配好的资源,从而省去重新分配内存再拷贝的过程。STL中多数容器resizing的时候调用容器元素的移动构造函数来移动资源。

_VSTD::move_if_noexcept()

为了保证容器类型数据的安全,多数情况下指挥调用被标记为noexcept的移动构造函数,否则会调用拷贝构造函数。因为,资源的移动过程中如果抛出异常,那么正在被处理的原始对象数据可能会因为异常而丢失,如果是拷贝构造函数,对资源进行拷贝而不对原始数据进行更改,无论是否抛出异常,都不会影响数据的正确性。

可以用于检测类的各种构造函数状态:

cout << boolalpha

<< is_move_constructible::value << endl //是否可以被移动构造

<< is_trivially_move_constructible::value << endl //是否具有普通的移动构造函数,“普通”的约束条件没有虚函数、没有虚基类、没有任何不稳定的非静态成员

<< is_nothrow_move_constructible::value << endl //是否具有不会抛出异常的移动构造函数

你可能感兴趣的:(C++中移动构造函数为什么需要加noexcept)