正如我在cppreference中看到的,经典的“抛出”声明列表现在在C++11中被弃用了。离开这个机制的原因是什么?我应该如何指定哪些异常抛出我的函数?
发布于 2012-12-12 22:19:03
有关更详细的推理,请参阅:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3051.html
正如上面国家机构评论中所表达的那样,例外规范在实践中没有被证明是有用的。关于C++中的异常规范的问题有很多讨论(例如,参见Sutter02、Boost03),但主要问题是:
在实践中,只有两种形式的异常抛出保证是有用的:操作可能抛出异常(任何异常),或者操作永远不会抛出任何异常。前者是通过完全省略异常规范来表示的,而后者可以表示为throw(),但由于性能方面的考虑,很少会这样做。
N3050引入了一种新的异常规范,noexcept,它指定函数不会抛出任何异常。与throw()不同,noexcept不需要编译器引入代码来检查是否抛出了异常。相反,如果指定为noexcept的函数通过异常退出,则结果是调用std::terminate()。
有了noexcept的引入,程序员现在可以表达在实践中有用的两种异常保证,而不需要额外的开销。因此,本文建议弃用“动态”异常规范,也就是那些写为throw(type-id-listopt)的异常规范。
发布于 2017-03-12 05:59:19
Peter给出的答案并没有触及实现者和用户的异常规范的实际问题:
如果实现者未能保证只通过调用具有异常规范的方法抛出已定义的exceptions.
结论是,C++应该像Java那样做:
Noexcept (因为C++11)遭受了相同的概念错误,因为如果不遵守规范,它也会导致运行时终止,例如,一个方法抛出了声明不是的方法。这使得除了最包含的情况(move constructors come to mind)之外,noexcept不可能用于任何严重的情况。
发布于 2012-12-12 22:17:32
它们会产生更慢更大的代码,因为libc++必须检查从函数中传播出来的任何异常是否违反了它的异常规范,并调用std::unexpected。这几乎是没有用的,而且比仅仅记录函数抛出的异常更糟糕。
https://stackoverflow.com/questions/13841559
复制相似问题