次の方法で共有


警告 C26440

関数は 'noexcept' として宣言できます。

C++ コア ガイドライン F.6: 関数がスローされない可能性がある場合は、それを宣言します noexcept

コードで例外が発生しない場合は、 noexcept 指定子を使用してマークする必要があります。 この注釈は、クライアント コード側でのエラー処理を簡略化するのに役立ち、コンパイラがより多くの最適化を行うことができます。

解説

  • 次の場合、関数は非スローと見なされます。
    • 明示的な throw ステートメントはありません。
    • その本体内の関数呼び出しがある場合は、スローする可能性が低い関数のみを呼び出します。 constexpr または非スロー動作を伴う例外指定でマークされた関数 (一部の非標準仕様を含む)。
  • throw()__declspec(nothrow)などの非標準および古い指定子は、noexceptと同等ではありません。
  • 明示的な指定子 noexcept(false)noexcept(true) は適切に尊重されます。
  • constexprとしてマークされた関数は、例外を引き起こすことは想定されておらず、分析されません。
  • ルールはラムダ式にも適用されます。
  • このロジックでは、再帰呼び出しはスローされない可能性があるとして考慮しません。 このロジックは、将来変更される可能性があります。

デストラクターを除くすべての関数は、noexcept がないため警告を表示します。

struct S
{
    S() {} // C26455, Default constructor may not throw. Declare it 'noexcept'
    ~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() noexcept {}
    ~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*/}
};