警告 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*/}
};
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示