禁用异常和 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 构造函数时,才会四处移动对象。
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 构造函数时,才会四处移动对象。