警告 C26439

此类函数可能不会引发。 请将其声明为“noexcept”。

C++ Core Guidelines F.6:如果函数不得引发异常,请将其声明为 noexcept

有些操作永远不应引发异常。 它们的实现应是可靠的,并且应该正常处理可能的错误情况。 它们不应该使用异常来指示失败。 此规则会标记此类操作未显式标记为 noexcept 的情况,这意味着它们可能会引发异常,并且使用者无法对其可靠性做出假设。

这些函数的可靠性非常重要,因为它们经常被用作构建块来实施具有异常安全保证的函数。 引发异常的移动构造函数将强制标准模板库 (STL) 容器回退到复制操作,从而降低运行时性能。

代码分析名称:SPECIAL_NOEXCEPT

注解

  • 特殊类型操作:

    • 析构函数;
    • 移动构造函数和移动赋值运算符;
    • 具有移动语义的标准函数:std::movestd::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*/}
};

另请参阅

C26455
C++ Core Guidelines F.6