警告 C26447
函式已宣告,
noexcept
但會呼叫可能會擲回例外狀況的函 式 function_name (f.6)。
C++ 核心指導方針:
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
來修正這些警告。