什么是noexcept有用?

use*_*014 28 c++ exception visual-studio noexcept c++11

我看到C++ 11添加了noexcept关键字.但我真的不明白它为什么有用.

如果函数在不应该抛出时抛出 - 为什么我希望程序崩溃?

那么什么时候应该使用它?

此外,它将如何与/ Eha和使用编译一起工作_set_se_translator?这意味着任何代码行都会抛出c ++异常 - 因为它可能抛出一个SEH异常(因为访问受保护的内存)并且它将被转换为c ++异常.

那会发生什么?

Die*_*ühl 37

主要noexcept用于通用算法,例如,在调整大小时std::vector<T>:对于有效算法移动元素,必须提前知道没有任何移动将抛出.如果移动元素可能会抛出,则需要复制元素.使用noexcept(expr)运算符,库实现可以确定特定操作是否可以抛出.不投掷操作的属性成为合同的一部分:如果违反合同,所有投注都将被取消,并且可能无法恢复有效状态.在造成更多伤害之前拯救是自然的选择.

为了传播有关noexcept操作的知识,不要抛出它也需要声明函数.为此,你会使用noexcept,throw()noexcept(expr)与一个常量表达式.在实现通用数据结构时,使用表达式的表单是必需的:使用表达式可以确定任何类型相关操作是否可能引发异常.

例如,std::swap()声明如下:

template <typename T>
void swap(T& o1, T& o2) noexcept(noexcept(T(std::move(o1)) &&
                        noexcept(o1 = std::move(o2)));
Run Code Online (Sandbox Code Playgroud)

noexcept(swap(a, b))然后,基于库可以选择不同效率的某些操作实现:如果它可以在swap()没有异常风险的情况下,它可能会暂时违反不变量并在以后恢复它们.如果可能抛出异常,则库可能需要复制对象而不是移动它们.

标准C++库实现不太可能依赖于许多操作noexcept(true).它可能检查的操作可能主要是那些涉及移动物体的操作,即:

  1. 类的析构函数(注意,析构函数默认情况下noexcept(true)甚至没有任何声明;如果你有可能抛出的析构函数,你需要声明它,例如:)T::~T() noexcept(false).
  2. 移动运算符,即移动构造(T::T(T&&))和移动赋值(T::operator=(T&&)).
  3. 类型的swap()操作(swap(T&, T&)可能还有成员版本T::swap(T&)).

如果这些操作中的任何一个偏离默认值,则应相应地声明它以获得最有效的实现.这些操作的生成版本声明它们是否根据用于成员和基础的相应操作抛出异常.

虽然我可以想象将来或某些特定的库可能会添加一些操作,但我可能不会像noexcept现在那样声明操作.如果出现其他有影响的功能noexcept,将来可以宣布(并可能根据需要进行更改).