我应该声明所有不抛出 noexexcept 的成员/函数吗?

Should I declare all members/function that doesn't throw noexcept?

本文关键字:成员 函数 noexexcept 声明 我应该      更新时间:2023-10-16

CppCoreGuidelines 之一是 E.12:当由于抛出而退出函数是不可能的或不可接受的时,请使用 noexcept 。 这是否意味着我应该在每个不抛出异常并且不调用抛出的其他方法/函数上声明 noexcept ?我知道总是尽可能多地声明 const 是一个很好的搪塞,而且我在不同的项目中看到了很多 const 方法,但我还没有看到 no,除了使用那么多。

我应该声明所有不抛出 noexexcept 的成员/函数吗?

这个答案不会试图回答这是否是一个好的做法(固执己见(,但请注意,这种做法在处理安全关键型C++开发时很常见,更严格的C++指南通常要求所有非抛出函数的声明都包含noexcept说明符。

汽车C++14 指南

例如,AUTOSAR(MISRA C++:2008 的非官方但来自行业事实上的继承者(在关键和安全相关系统中使用 C++14 语言的指南中的规则 A15-4-4 涵盖了这种做法以及基本原理:

规则 A15-4-4(必需、实施、自动(

非抛出功能的声明应包含除说明外的无内容。

理由

Noexcept 规范是程序员通知 编译器 函数是否应引发异常。这 编译器可以使用此信息在 非抛出函数以及启用 noexcept 运算符,这 可以在编译时检查特定表达式是否声明为 引发任何异常。

Noexcept 规范也是一种通知其他程序员的方法 函数不会引发任何异常。

非抛出函数需要声明 noexcept 说明符。 根据模板可能会也可能不会引发异常的函数 参数,需要使用 noexcept(( 说明符。

请注意,假设一个不包含 显式 noexcept 规范会引发异常,类似于 声明 noexcept(false( 说明符的函数。

如果要声明代码库以符合准则,则所需的标记应用于需要满足的规则:

5.1.2 按义务等级划分的规则分类

必需:这些是对代码的强制性要求。C++声称符合AUTOSAR C++14的代码应符合 每个"必需"规则。在正式偏差的情况下,必须提出正式偏差 事实并非如此。

当然,由特定公司/供应商决定是否以及如何遵守 AUTOSAR C++14,但通常 OEM 要求遵守特定的 conding 标准,例如 MISRA C++:2008 或 AUTOSAR C++14 C++,偏离特定规则通常需要经过正式的偏差过程。

自动标记应用于可以通过静态分析轻松自动执行的规则。

你应该声明每个不能或不应该抛出的函数,noexcept.
不多也不少。

请记住,除非你说清楚,否则消费者无法知道你的意图,他们会依赖你写的东西。这并不是要减损成群结队的人试图在不阅读任何东西的情况下蒙混过关。

如果你把巧合编纂成一个角落,你就把自己画进了一个角落,并且将很难改进实现.
如果你没有编纂你的合同,消费者将不得不从实现中设计它,他们会比你预期的更多,把你画到一个角落(再次(。

这并不是说没有规则和指导方针将巧合(某些财产(不(成立(与意图(某些财产应该/不能持有(错误

地错误。