我应该声明所有不抛出 noexexcept 的成员/函数吗?
Should I declare all members/function that doesn't throw noexcept?
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
.
不多也不少。
请记住,除非你说清楚,否则消费者无法知道你的意图,他们会依赖你写的东西。这并不是要减损成群结队的人试图在不阅读任何东西的情况下蒙混过关。
如果你把巧合编纂成一个角落,你就把自己画进了一个角落,并且将很难改进实现.
如果你没有编纂你的合同,消费者将不得不从实现中设计它,他们会比你预期的更多,把你画到一个角落(再次(。
这并不是说没有规则和指导方针将巧合(某些财产(不(成立(与意图(某些财产应该/不能持有(错误
地错误。- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法