警告 C26439
這類函式可能不會擲回。 將其宣告為 'noexcept'。
C++ 核心指導方針 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*/}
};