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