禁用异常和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);
如果我在我的程序中禁用异常(如-fno-exceptions
为g++) std::swap
将使用移动操作为我的自定义类型,如果他们是移动启用无论他们是否不例外?
编辑:后续问题:
意识到std::swap将总是使用移动,如果我的类型有它们,我真正的问题是发生了什么特征,如is_nothrow_move_assignable<>
?
如果我的类型有noexcept(true)
移动操作,std::vector
在重新分配时总是使用移动吗?
swap
上的noexception -specification仅告诉用户她可以在哪里使用swap
而不会遇到异常。的实现实际上总是等同于
auto tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
当且仅当重载解析选择move赋值操作符和/或构造函数时,
是。noexcept
只是指定如果T
的move构造函数和move赋值不抛出,std::swap
不会抛出。无论如何,它不会影响swap
体的行为——它将使用T
的move构造函数和move赋值,不管它们是否抛出,也不管你是否启用异常编译。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 使用 noexcept 和编译器标志来关闭异常
- "CalucateNumbers"缺少异常规范"noexcept"
- 捕获其中所有异常的C++函数是否"noexcept"?
- 我应该声明我的异常的副本构造函数noexcept吗
- C noExcept对于不引发异常的函数,可能会导致内存故障
- 从 noexcept 函数参数的构造函数引发的异常会立即导致对 std::terminate() 的调用吗?
- g++-4.8.1认为没有异常说明的显式声明的析构函数总是noexcept(true)
- noexcept(false)析构函数覆盖所有特殊成员函数'异常规范
- 禁用异常和noexcept()