次の方法で共有


警告 C26439

この種類の関数は throw できません。 'noexcept' を宣言します。

C++ Core Guidelines 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