禁用异常和noexcept()

disabled exceptions and noexcept()

本文关键字:noexcept 异常      更新时间:2023-10-16

std::swap是这样声明的:

template <class T> void swap (T& a, T& b)
    noexcept (is_nothrow_move_constructible<T>::value && 
              is_nothrow_move_assignable<T>::value);

如果我在我的程序中禁用异常(如-fno-exceptionsg++) std::swap将使用移动操作为我的自定义类型,如果他们是移动启用无论他们是否不例外?

编辑:后续问题:

意识到std::swap将总是使用移动,如果我的类型有它们,我真正的问题是发生了什么特征,如is_nothrow_move_assignable<> ?

如果我的类型有noexcept(true)移动操作,std::vector在重新分配时总是使用移动吗?

swap上的noexception -specification仅告诉用户她可以在哪里使用swap而不会遇到异常。的实现实际上总是等同于

auto tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);

当且仅当重载解析选择move赋值操作符和/或构造函数时,

移动对象。

是。noexcept只是指定如果T的move构造函数和move赋值不抛出,std::swap不会抛出。无论如何,它不会影响swap体的行为——它将使用T的move构造函数和move赋值,不管它们是否抛出,也不管你是否启用异常编译。