【发布时间】:2015-07-28 09:48:49
【问题描述】:
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-exceptions 用于 g++)如果我的自定义类型启用了移动,std::swap 将使用移动操作,无论它们是 noexcept 还是不是吗?
编辑:后续问题:
在意识到 std::swap 将始终使用移动(如果我的类型有它们)之后,我真正的问题是像 is_nothrow_move_assignable<> 这样的特征会发生什么?
如果我的类型有 noexcept(true) 移动操作,std::vector 在重新分配时是否总是使用移动?
【问题讨论】:
-
编译器的
move规则与异常正交。 -
@AmiTavory 移动规则是的,但是像
is_nothrow_move_constructible这样的特征呢? -
编写一个简短的(3 行)测试程序,打印出
is_nothrow_move_constructible的结果,使用和不使用-fno-exceptions 进行编译 -
@RichardCritten 我刚刚尝试过 - 使用
-fno-exceptions并不能满足所有需求noexcept(true)...