警告 C26439
この種類の関数は throw できません。 'noexcept' を宣言します。
C++ Core Guidelines F.6: 関数がスローしてはならない場合は、それを宣言します noexcept
一部の操作では例外をスローしないでください。 実装の信頼性を高めて、起こりうるエラー状態を適切に処理する必要があります。 エラーを示すために例外を使用しないでください。 このルールは、このような操作が明示的にマークされていない場合にフラグを設定 noexcept
します。つまり、例外がスローされる可能性があり、コンシューマーはその信頼性に関する想定を行うことはできません。
これらの関数は、例外の安全性を保証する関数を実装するための構成要素として頻繁に使用されるため、信頼性が 高いことが重要です。 スローする移動コンストラクターは、標準テンプレート ライブラリ (STL) コンテナーをコピー操作にフォールバックさせ、実行時のパフォーマンスを低下させます。
コード分析名: SPECIAL_NOEXCEPT
解説
特殊な操作:
- デストラクター
- 移動コンストラクターと移動代入演算子
- 移動セマンティクスを持つ標準関数:
std::move
およびstd::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*/}
};