6

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-exceptionsfor g++std::swap,如果它们启用了移动,无论它们是否为 noexcept,我的自定义类型都会使用移动操作?

编辑:后续问题:

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

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

4

2 回答 2

4

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

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

当且仅当重载决议选择移动赋值运算符和/或构造函数时,它会移动对象。

于 2015-05-16T14:43:00.257 回答
3

是的。noexcept只需指定std::swap不会抛出 ifT的移动构造函数和移动赋值不会抛出。它不会影响任何主体的行为-无论它们是否抛出,也无论您是否在启用异常的情况下编译swap,它将使用' 移动构造函数和移动赋值。T

于 2015-05-16T14:42:53.083 回答