Share via


警告 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*/}
};