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