

noexceptに関する解説を見ると、その関数が例外を送出しないときに指定するという説明がありました。実用的にはどのような目的のために用いられるのでしょうか。みなさんは、普段の開発で、最終的にはどのような目的を達成するためにnoexceptを用いていますでしょうか。


CC BY-SA 4.0
2021-03-08T11:37:44.410
74524
2021-03-23T01:53:24.620
37013
question
c++
noexceptを実用的にはどのように使っていますか？


`noexcept` は [c++11](/questions/tagged/c%2b%2b11 "'c++11' のタグが付いた質問を表示")
で導入された仕様ですから [c++98](/questions/tagged/c%2b%2b98 "'c++98' のタグが付いた質問を表示") や
[c++03](/questions/tagged/c%2b%2b03 "'c++03' のタグが付いた質問を表示")
にはありませんでした。なのでその昔から維持しているコードでは使っていません・使えませんでした。逆に
[c++98](/questions/tagged/c%2b%2b98 "'c++98' のタグが付いた質問を表示") /
[c++03](/questions/tagged/c%2b%2b03 "'c++03' のタグが付いた質問を表示") のレガシーな「例外仕様
(Exception Specification) 」は [c++11](/questions/tagged/c%2b%2b11 "'c++11'
のタグが付いた質問を表示") で非推奨 [c++17](/questions/tagged/c%2b%2b17 "'c++17'
のタグが付いた質問を表示") で削除になっています。  
<https://cpprefjp.github.io/lang/cpp17/remove_deprecated_exception_specifications.html>

で、いつ使うかですが、

  * デストラクタ中で例外を投げてはならない、を保証する  
デストラクタの中（だけ）で使う作業関数に `noexcept` を明示するとこれが自動で担保できる

  * 例外機構のための命令を生成させないことにより省メモリ高速化を実現する  
例外トラップのための準備などに機械語レベルで数命令必要なことがありますが、これを省ける

  * 例外処理そのものを実装するためのライブラリソースコードで使える
  * 割り込みハンドラなど例外機構と相性が悪いところで使える

例外自体を一切使わない（組み込み系だと [Embedded
C++](https://ja.wikipedia.org/wiki/Embedded_C%2B%2B) なんてのもあるが死産状態）となると既存の
[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") ソースコードすべてを再実装になってしまうので
`noexcept` を積極的に使う場面はかなり限られると思います。

# オイラの場合組み込み系 [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") コンパイラが
[c++11](/questions/tagged/c%2b%2b11 "'c++11' のタグが付いた質問を表示")
に未対応なことが多い関係で、メインのお仕事では一度も使ったことないです


CC BY-SA 4.0
2021-03-08T22:13:17.627
74531
2021-03-08T22:13:17.627
8589
74524
answer


> 実用的にはどのような目的のために用いられるのでしょうか。

`noexcept`指定子の利用目的は、大きく2つあります。

  * 安全性保障：デストラクタからの例外送出などの危険な処理を避ける
  * 処理効率化：例外送出なしを利用してより効率的な実装を用いる

注意点として、`noexcept`指定有無は外部公開インタフェースの一部とみなされます。ある関数に`noexcept`指定を付けるということは「この関数の外部仕様として例外送出しない」という宣言ですから、将来的には例外送出の可能性があるならば付与してはいけません（非常に気づきにくい破壊的なAPI仕様変更につながります）。

* * *

`noexpcet`の利用については [C++ Core
Guideline](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)（同[タイトル日本語訳](https://qiita.com/tetsurom/items/322c7b58cddaada861ff)）にいくつかガイドライン項目が示されています。

  * [F.6: If your function must not throw, declare it `noexcept`](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-noexcept)
  * [C.37: Make destructors `noexcept`](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-dtor-noexcept)
  * [C.66: Make move operations `noexcept`](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c66-make-move-operations-noexcept)
  * [C.83: For value-like types, consider providing a `noexcept` swap function](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c83-for-value-like-types-consider-providing-a-noexcept-swap-function)
  * [C.85: Make swap `noexcept`](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c85-make-swap-noexcept)
  * [C.86: Make `==` symmetric with respect to operand types and `noexcept`](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c86-make--symmetric-with-respect-to-operand-types-and-noexcept)
  * [C.89: Make a hash `noexcept`](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c89-make-a-hash-noexcept)
  * [E.12: Use `noexcept` when exiting a function because of a `throw` is impossible or unacceptable](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Re-noexcept)


CC BY-SA 4.0
2021-03-23T01:46:37.893
74828
2021-03-23T01:53:24.620
2021-03-23T01:53:24.620
49
49
74524
answer