共用方式為


警告 C26439

這類函式可能不會擲回。 將其宣告為 'noexcept'。

C++ 核心指導方針 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++ 核心指導方針 F.6