本篇内容主要讲解“C++怎么对抛出异常的函数使用noexcept”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么对抛出异常的函数使用noexcept”吧!
如果函数不会抛出异常,则声明为noexcept
如果经过推断不会抛出异常,程序就不必假设需要处理错误并且尽快终止执行。声明函数为noexcept可以通过减少可能的执行路径的方式帮助优化程序。这样做也会加速失败后的退出处理。
Example(示例)
为完全使用C写成或者不会发生异常的其他语言构成的函数增加noexcept修饰。C++标准库暗中为所有的C标准库函数做了相同的事情。
constexpr函数在运行时刻可以抛出异常,因此你可以为某些(不是全部)constexpr函数指定noexcept。
译者注:例如被0除。
Example(示例)
你甚至可以对可以抛出异常的函数使用noexcept。
vector<string> collect(istream& is) noexcept{ vector<string> res; for (string s; is >> s;) res.push_back(s); return res;}
如果collect()在运行时耗尽了内存,程序就会崩溃。除非程序经过精心设计可以避免内存耗尽,这可能是可以做的唯一的事情了。terminate()可能生成适当的错误日志信息(但是当内存耗尽时,很难难精巧地完成任何事)
译者注:声明noexcept就是告诉编译器不需要生成捕获和向外传递异常的机制了。如果实际上发生了异常,其结果就如本节所描述。作者这里想说的应该是:错误指定noexcept属性是有风险的。
当需要决定是否为函数标记noexcept时,必须注意代码执行时所处的执行环境。最重要的原因是关于抛出异常和内存分配的议题。试图被完美地普遍使用的代码(例如标准库或其他类似代码)需要支持bad_loc异常可能被有意义地处理的环境(而不只是简单中止执行,译者注)。然而,大多数程序和执行环境无法有意义地处理分配内存失败,而且在那些情况下,中止程序是申请内存失败最干净和最简单的处理。如果你知道你的应用程序不能处理内存分配错误,哪怕函数包含内存分配动作,为其增加noexcept可能也是适当的。(这样可以触发terminate处理,译者注)
换句话说,大多数程序,大多数函数都会抛出异常(例如,它们可能是使用new,可能会调用可能抛出异常的函数,或者使用了通过抛出异常报告错误的库函数),因此不要在不考虑异常是否会被处理的情况下就到处使用noexcept。
noexcept对于那些经常使用的,低层次的函数特别有用(而且很容易判断正确性)。
Note(注意)
析构函数,交换函数,移动操作和默认构造函数永远不应该抛出异常。
Enforcement(实施建议)
Flag functions that are not noexcept
, yet cannot throw.
标记那些没有noexcpet属性但是又不抛出异常的函数。
Flag throwing swap
, move
, destructors, and default constructors.
标记抛出异常的交换/移动操作,析构函数和默认构造函数。
到此,相信大家对“C++怎么对抛出异常的函数使用noexcept”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。