警告 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
来解决方法这些警告。