- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
CppCoreGuidelines 之一是 E.12:因为抛出是不可能的或 Not Acceptable 而退出函数时使用 noexcept。这是否意味着我应该在不抛出异常并且不调用抛出的其他方法/函数的每个成员和函数上声明 noexcept ?我知道总是尽可能多地声明 const 是一个很好的搪塞,我在不同的项目中看到了很多 const 方法,但是我没有看到 noexcept 使用那么多。
最佳答案
Should I declare all members/function that doesn't throw noexcept?
这个答案不会试图回答这是否是一个好的做法(自以为是),但请注意,在进行安全关键的 C++ 开发时,这种做法很常见,而且更严格的 C++ 准则通常要求 所有非抛出函数的声明都包含 noexcept
specifier .
例如,Guidelines for the use of the C++14 language in critical and safety-related systems 中的规则 A15-4-4来自 AUTOSAR(一个非官方的,但来自 MISRA C++:2008 的行业事实上的继任者)涵盖了这种做法以及一个基本原理:
Rule A15-4-4 (required, implementation, automated)
A declaration of non-throwing function shall contain noexcept specification.
Rationale
Noexcept specification is a method for a programmer to inform thecompiler whether or not a function should throw exceptions. Thecompiler can use this information to enable certain optimizations onnon-throwing functions as well as enable the noexcept operator, whichcan check at compile time if a particular expression is declared tothrow any exceptions.
Noexcept specification is also a method to inform other programmersthat a function does not throw any exceptions.
A non-throwing function needs to declare noexcept specifier.A function that may or may not throw exceptions depending on a templateargument, needs to explicitly specify its behavior usingnoexcept() specifier.
Note that it is assumed that a function which does not containexplicit noexcept specification throws exceptions, similarly tofunctions that declare noexcept(false) specifier.
required 标签应用于规则,如果要声称代码库符合指南要求,则需要满足这些规则:
5.1.2 Rule classification according to obligation level
required: these are mandatory requirements placed on the code. C++ code that is claimed to conform to AUTOSAR C++14 shall comply withevery “Required” rule. Formal deviations must be raised where this isnot the case.
当然,由特定公司/供应商决定是否以及如何遵守 AUTOSAR C++14,但通常 OEM要求符合特定的条件标准,例如对于 C++ MISRA C++:2008 或 AUTOSAR C++14,与特定规则的偏差通常需要经过正式的偏差流程。
automated 标签应用于可以通过静态分析轻松自动执行的规则。
关于c++ - 我应该声明所有不抛出 noexcept 的成员/函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62713967/
考虑: class test { private: int n; int impl () const noexcept { return
#include class A { std::vector vec; void swap( A & other) noexcept(noexcept(vec.swap(other.
在 the C++ standard有如下定义: template void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a,
从 c++20 开始,我们可以使用 consteval 说明符定义立即数函数。当一个函数被声明为 consteval 时,对该函数的每次调用都必须产生一个编译时常量,否则该程序就是病式的。此外,由于
为什么 noexcept 运算符采用表达式而不是函数签名/声明? 考虑以下虚拟示例: #include void strProcessor(const std::string& str) noexc
我有一段通用代码,其性能对我来说很重要,因为我面临着与用 C 编写的著名手工代码的运行时间相匹配的挑战。在开始使用 noexcept 之前,我的代码运行时间为 4.8 秒。通过将 noexcept 放
如果我将函数标记为 noexcept(false),或任何其他计算结果为 false 的表达式,这意味着什么? (1) 我是否向编译器保证该函数可以抛出异常?,(2) 还是我不保证它是否可以抛出异常?
我们遇到过这种情况,想知道解决它的最佳方法 template struct A : T { A(T &&t) noexcept(noexcept(T(std::move(t)))) :T
此代码使用 gcc 4.8.2 (-std=c++11) 编译失败,但使用 clang 3.4 (trunk) (-std=c++11) 编译: #include #include struct
当函数标记为 noexcept 时,GCC 或 Clang 中是否有一个标志会抛出编译时错误(或警告)尝试调用未标记为 noexcept 的函数? 如果不是,那么当您删除 noexcept 时,您应该
假设我有一个类 class C : public B { public: C() noexcept; } noexcept 说明符是否需要基类的相同 promise ?也就是说,当我考虑使
长标题:为什么 std:variant 的 operator=(T&& t) 的 noexcept 规范不依赖于内部类型的析构函数的 noexcept 规范? 我可以在 cppreference 上看
在下面的代码中,我尝试对函数使用条件异常规范,但编译失败,尽管如果在函数外部使用它就可以了。 void may_throw(); // ERROR: expression must have bool
目前在C++这些都不可能,编译器提示它需要一个表达式。 这对我来说似乎微不足道,如果您正在构建一个具有可变数量类型的类似元组的对象,如何检查所有这些类型是否都是 nothrow default/mov
在 The C++ Programming Language 一书中写道,您可以将函数声明为有条件的 noexcept .例如: template void my_fct(T& x) noexcept
根据this question的回答,默认移动构造函数可以定义为 noexcept在一定条件下。例如,下面的类生成一个 noexcept移动构造函数: class C {}; 根据对this ques
拿这个代码: template void my_func() { T::some_method(); } int main() { std::cout ()) ? "noexcept" :
这个声明没问题: void memberFunction(T& functor, double value)noexcept(noexcept(functor(value))); 对于一个 templ
我在思考 noexcept 时遇到了一些麻烦。 template int pop(int idx) noexcept(noexcept(SIZE > 0)) // this is what I do
为什么 std::decay 不从函数指针中移除 noexcept 说明符? 例如这符合 c++17 #include template struct is_noexcept {}; templat
我是一名优秀的程序员,十分优秀!