警告 C26439
此类函数可能不会引发。 请将其声明为“noexcept”。
C++ Core Guidelines F.6:如果函数不得引发异常,请将其声明为 noexcept
有些操作永远不应引发异常。 它们的实现应是可靠的,并且应该正常处理可能的错误情况。 它们不应该使用异常来指示失败。 此规则会标记此类操作未显式标记为 noexcept
的情况,这意味着它们可能会引发异常,并且使用者无法对其可靠性做出假设。
这些函数的可靠性非常重要,因为它们经常被用作构建块来实施具有异常安全保证的函数。 引发异常的移动构造函数将强制标准模板库 (STL) 容器回退到复制操作,从而降低运行时性能。
代码分析名称:SPECIAL_NOEXCEPT
注解
特殊类型操作:
- 析构函数;
- 移动构造函数和移动赋值运算符;
- 具有移动语义的标准函数:
std::move
和std::swap
。
非标准和过时的说明符(例如
throw()
或declspec(nothrow)
)不等同于noexcept
。合理遵循显式说明符
noexcept(false)
和noexcept(true)
。
示例
该工具会对除析构函数之外的所有函数发出警告,因为它们缺少 noexcept
。
struct S
{
~S() {}
S(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
S& operator=(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
S(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
S& operator=(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
};
使用 noexcept
修饰同一结构后,所有警告都会被移除。
struct S
{
~S() {}
S(S&& s) noexcept {/*impl*/}
S& operator=(S&& s) noexcept {/*impl*/}
S(const S& s) noexcept {/*impl*/}
S& operator=(const S& s) noexcept {/*impl*/}
};