禁用异常和noexcept()

时间:2015-05-16 14:39:10

标签: c++ c++11 g++ 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将使用我的自定义类型的移动操作,如果它们是移动启用的,无论是否它们是不是没有?

编辑:后续问题:

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

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

2 个答案:

答案 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的移动构造函数并移动赋值,无论它们是否抛出,无论是否在启用异常的情况下编译。