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
将使用我的自定义类型的移动操作,如果它们是移动启用的,无论是否它们是不是没有?
编辑:后续问题:
在意识到std :: swap将始终使用移动时,如果我的类型有移动,我真正的问题是is_nothrow_move_assignable<>
等特征会发生什么?
如果我的类型有std::vector
移动操作,noexcept(true)
在重新分配时会一直使用移动吗?
答案 0 :(得分:4)
swap
上的noexcept规范仅告诉用户她可以使用swap
而不会遇到异常。 实施几乎总是等同于
auto tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
当且仅当重载决策选择移动赋值运算符和/或构造函数时,才会移动对象。
答案 1 :(得分:2)
是。 noexcept
只是指定std::swap
如果T
的移动构造函数不会抛出,并且移动赋值不会抛出。它不会影响swap
的主体的行为 - 它将使用T
的移动构造函数并移动赋值,无论它们是否抛出,无论是否在启用异常的情况下编译。