警告 C26447

该函数声明为 noexcept,但调用可能引发异常的函数 function_name (f.6)。

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

备注

此规则修改了另一条规则 C26440 DECLARE_NOEXCEPT,该规则试图找到适合标记为 noexcept 的函数。 在这种情况下,理念是,一旦将某个函数标记为 noexcept,要保持其协定,便不得调用可能引发异常的其他代码。

  • Microsoft C++ 编译器已经处理了诸如函数体中的 throw 语句之类的直接违规行为(请参阅 C4297)。
  • 该规则仅关注函数调用。 该规则标记的是哪些不属于 constexpr 并且可能引发异常的目标。 换句话说,它们没有通过使用 noexcept__declspec(nothrow) 或 throw() 显式标记为非抛出。
  • 编译器生成的目标函数被跳过以减少噪音,因为编译器并不总是提供异常规范。
  • 检查器还会跳过我们希望你作为 noexcept 实现的特殊类型的目标函数;此规则由 C26439 SPECIAL_NOEXCEPT 强制执行。

示例

#include <vector>
#include <string>
#include <istream>

std::vector<std::string> collect(std::istream& is) noexcept
{
    std::vector<std::string> res;
    for (std::string s; is >> s;) // C26447, `operator bool()` can  throw, std::string's allocator can throw
        res.push_back(s);         // C26447, `push_back` can throw
    return res;
}

可以通过从函数签名中删除 noexcept 来解决方法这些警告。

另请参阅

C26440 DECLARE_NOEXCEPT