曾几何时,在 C++ 中,可以为方法/函数指定 nothrow 规范。这表明该方法/函数不会抛出异常。
作为一个有纪律的用户,我尝试在我的时间使用这个规范。但很快就发现,在开发过程中,跟踪哪些函数抛出异常以及哪些函数没有抛出异常是非常乏味的。我不再指定 nothrow。
现在有一个项目,原则上不会产生异常。结果,问题出现了。
问题:
标准当前支持 nothrow 吗?
现在标准中推荐使用 nothrow 吗?或者,就像新 C++ 经常出现的情况一样,它已被弃用。
nothrow 规范有什么用?使用 nothrow 规范时,编译器可以生成更快/更紧凑的代码吗?还是没有区别?
是否可以立即告诉翻译器所有类方法都有 nothrow 规范?为了不弄乱每种方法,也不要在其中指定 nothrow。
您很可能在谈论
throw(),因为。std::nothrow有点不同。该规范throw()在 C++17 中被标记为弃用,并将从未来的标准中删除,因此不推荐使用。在现代标准中,还有另一个说明符:noexcept,其本质是std::terminate在异常离开带有此说明符标记的函数时调用。使用
noexcept代码可能会更好,但这个说明符的主要任务是设置适当的接口。因此,没有什么机制可以做所有事情noexcept——每个接口都必须被显式标记(除了noexcept默认的析构函数)。关于常量
std::nothrow_t nothrow和说明符 的一些信息noexcept众所周知:当
operator new它无法分配内存时,它会抛出一个异常std::bad_alloc。为了演示,让我们编写一个函数:但也许我们需要编写不抛出异常的相同函数。并且经常方便用户知道这个函数不会抛出任何异常(我们可以在函数声明中明确说明这一点)。
在我们的程序中:
这只是演示什么以及如何...