目次
noexceptとは
noexcept は、関数が例外を送出しないことを示すための指定です。これにより、コンパイラはその関数が例外を投げないことを保証し、最適化やエラーハンドリングの最適化を行うことが可能になります。
利点
- 最適化の向上
-
例外を投げないことが保証されるため、コンパイラはそれに基づいて最適化を行うことができます。
- 安全性の向上
-
関数が例外を投げないことがわかるため、呼び出し側でのエラーハンドリングをより効果的に行うことができます。
注意点
noexcept を過剰に使用すると、意図しない強制終了の原因となることがあります。関数が例外を投げる可能性がある場合は、正確にその挙動を把握してから noexcept を指定するようにしましょう。
noexceptの使い方
関数の宣言
void func() noexcept;
このように関数の宣言で noexcept
をつけると、その関数が例外を投げないことを表します。もし関数が意図せず例外を投げてしまった場合には、std::terminate
が呼ばれてプログラムが強制終了します。
関数の定義
void func() noexcept {
// 例外を投げない処理
}
実際の関数の定義でも noexcept
を明示することができます。
関数テンプレート
template <typename T>
void func(T value) noexcept(noexcept(T(value))) {
// T(value) の例外仕様を反映させる
}
テンプレート関数の場合、そのテンプレートパラメータの型のコンストラクタが noexcept
であるかどうかを条件に指定することもできます。
具体的には、テンプレート関数が引数 value
を受け取る際に、その引数 value
の型 T
のコンストラクタが例外を投げる可能性があるかどうかを noexcept
でチェックし、それに応じて関数全体が noexcept
かどうかを決めることができます。