【问题标题】:Should I declare all members/function that doesn't throw noexcept?我应该声明所有不抛出 noexcept 的成员/函数吗?
【发布时间】:2020-10-24 02:14:00
【问题描述】:

CppCoreGuidelines 之一是 E.12:在退出函数时使用 noexcept,因为抛出是不可能或不可接受的。 这是否意味着我应该在每个不抛出异常且不调用其他抛出异常的方法/函数的成员和函数上声明 noexcept ?我知道总是尽可能多地声明 const 是一个很好的推诿,我在不同的项目中看到了很多 const 方法,但我没有看到 noexcept 使用得这么多。

【问题讨论】:

    标签: c++ c++11 exception constants noexcept


    【解决方案1】:

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

    请记住,除非您将其说明,否则消费者无法知道您的意图,他们将依赖您所写的内容。这并不是要减少他们成群结队地试图在不读任何东西的情况下蒙混过关。

    如果你把巧合编成代码,你会把自己画到一个角落里,并且很难改进实施。
    如果您未能编纂您的合同,消费者将不得不从实施中对其进行定义,他们会比您预期的更多地阅读合同,将您(再次)逼到角落。

    这并不是说没有规则和指导方针可以防止错误巧合(某些属性确实(不)持有)与意图(某些属性应该/不得持有)。

    【讨论】:

      【解决方案2】:

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

      这个答案不会试图回答这是否是一个好的做法(自以为是),但请注意,这种做法在使用安全关键 C++ 开发时很常见,并且通常更严格的 C++ 指南要求 所有非抛出函数的声明都包含noexcept specifier

      AUTOSAR C++14 指南

      例如,AUTOSAR 的Guidelines for the use of the C++14 language in critical and safety-related systems 的规则 A15-4-4(MISRA C++:2008 的行业事实上的继任者)涵盖了这种做法以及基本原理:

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

      非抛出函数的声明应包含 noexcept 规范。

      基本原理

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

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

      非抛出函数需要声明 noexcept 说明符。 根据模板可能会或可能不会抛出异常的函数 参数,需要使用明确指定其行为 noexcept() 说明符。

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

      required 标记应用于如果代码库声称符合准则,则需要执行的规则:

      5.1.2 根据义务级别的规则分类

      必需:这些是对代码的强制性要求。声称符合 AUTOSAR C++14 的 C++ 代码应符合 每个“必需”规则。在这种情况下,必须提出正式的偏差 不是这样的。

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

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

      【讨论】:

      • 这样一个规则的一个问题是,它一味地把巧合编成代码,把它推入界面,扼杀了未来的发展。
      • 指南在安全关键开发中不需要任何东西。安全标准要求有证据,达到适当的技术严格水平,系统按要求运行。您引用的指南旨在更容易提供该理由。但是,同样,如果有适当的理由,可以完全或逐案忽略这些指导方针。一些监管或政策框架可能会强制要求遵循指南,但在其他情况下,指南是建议性的,而非强制性的。
      • @Deduplicator 我不会(我的回答也不会)对各种更严格的安全关键 C++ 开发指南规则是否合理提出任何固执己见。
      • @Peter 根据 AUTOSAR C++ 指南的第 5.1.2 节(在 MISRA C++:2008 中有类似的要求):必需:这些是 对代码的强制性要求声称符合AUTOSAR C++14 应符合每条“必需”规则的C++代码。如果不是这种情况,则必须提出正式的偏差。”。自然由特定公司/供应商决定是否以及如何遵守 AUTOSAR C++14,但许多 OEM 要求遵守例如 MISRA /AUTOSAR,与特定规则的偏差需要经过正式的偏差流程。
      • @deduplicator:这就是消费级软件和安全软件的区别。根据 ISO26262 第 6 部分表 9,静态代码分析是强制性的,从 ASIL B 开始。但即使对于 ASIL QM,也应该执行它。合格的工具 PcLintPlus、Coverity 和 Polyspace 会告知您该问题。这必须修复。所以,也许请记住,当您下次驾驶带转向或线控制动的汽车时。 . .对于消费级代码,一切正常。谁在乎?
      猜你喜欢
      • 1970-01-01
      • 2015-10-26
      • 2014-03-05
      • 2014-04-02
      • 2014-02-23
      • 1970-01-01
      • 2015-02-22
      • 2017-05-22
      • 1970-01-01
      相关资源
      最近更新 更多