禁用异常和 noexcept()

disabled exceptions and noexcept()

std::swap 是这样声明的:

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

如果我在我的程序中禁用异常(比如 g++-fno-exceptions),如果我的自定义类型被移动,std::swap 将使用移动操作- 无论是否为 noexcept 都已启用?

编辑:后续问题:

在意识到 std::swap 将始终使用移动(如果我的类型有移动)之后,我真正的问题是像 is_nothrow_move_assignable<> 这样的特征会发生什么?

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

是的。 noexcept 只是指定如果 T 的移动构造函数和移动赋值不会抛出,则 std::swap 不会抛出。它不会影响 swap 的主体的行为 - 它将使用 T 的移动构造函数和移动赋值,无论它们是否抛出并且无论您是否在启用异常的情况下进行编译.

swap 上的 noexcept 规范仅告诉 用户 她可以在何处使用 swap 而不会遇到异常。 实现实际上总是等同于

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

当且仅当重载决策选择了移动赋值运算符 and/or 构造函数时,才会四处移动对象。