最近、私のコードではnoexcept(false)
、主にコードを読む人のために、例外をスローすることがわかっている関数について明示的に書いています。ただし、これがコードの動作やコンパイラの解釈方法に影響するかどうかは疑問です。違いはありますか?
注:デストラクタは暗黙的に noexcept であり、それnoexcept(false)
を変更するには指定する必要があることを認識しています。他の関数について疑問に思っています。
例外指定子を持たないことと明示的に述べることnoexcept(false)
は同等です。§15.4/12 を参照してください。
noexcept(constant-expression)
例外仕様のない関数、または定数式が生成する形式の例外仕様を持つ関数は、false
すべての例外を許可します。
したがって、コンパイラは例外を考慮するときにそれらを区別するべきではありません。
さらに重要なことは、関数に追加する必要がないことですnoexcept(false)
。C++ 開発者は、すべての関数がデフォルトでスローされると想定する必要があります (これが、標準がこのスタンスを取る理由です)。したがって、書き出すことによって新しい情報を追加することはありません。誰にとっても時間の無駄です。
むしろ、関数が絶対にスローしない特別なケースを でマークし、何らかの条件によってnoexcept
関数がnoexcept(condition)
スローする可能性があるケースを でマークしてください。
関数が意図的に何らかの例外のソースである場合はE
、それをドキュメントに書いてください。
彼の著書More Exceptional C++で、Herb Sutterは次のスニペットを持っています (pp. 130):
例 19-1 に対する正しい答えは、はるかに単純です。
// Example 19-4: The right solution // T::~T() /* throw() */ { // ... code that won't throw ... }
例19-4は、ワッフルではなく設計上の決定を行う方法を示しています。
throw()
throws-nothing 例外指定は単なるコメントであることに注意してください。これが、私が従うことを選択したスタイルです。例外仕様がもたらすメリットは、その価値よりもはるかに少ないことが判明したためです。実際に仕様を書くかどうかは、好みの問題です。
(私のものを強調)
したがって、C++ 例外セーフ コードの主要な専門家の 1 人が、コンパイラが使用する例外仕様を追加するという概念全体に反対しているように見えることを指摘しなければならないと思います (ただし、プログラマが理解できるように例外仕様をコードに残しています)。 .
面白い情報かも…と思ったら…