そもそも、例外指定をdeprecatedにする意味は、例外指定が、現実の世界では、全く役に立たなかったからである。
noexceptの目的は、関数は例外を投げないと明示することより、コンパイラに、最適化のヒントを与えるものである。静的なソースコードの解析が目的ではない。
例外指定の、かつての目的は、単なるシンタックスシュガーであった。最適化のヒントは、全く意図していなかったのである。
なぜ、現実世界では、例外指定は、笑えるほどに失敗したのか。テンプレート引数がどのような型なのか、わからないからである。
template < typename T > void f( T x ) { // Tのコピーコンストラクタが例外を投げるかもしれない。 }
このようなコードで、例外指定で、実際に投げる例外を指定出来るわけがない。
では、noexceptを指定したコードで、例外を投げるパスがある場合、コンパイラはエラーを出すべきであるという意見はどうか。これは、非現実的である。そのためには、翻訳単位を超えた、大規模な静的解析が必要である。すべてのコンパイラに、そのような実装を求めるのは、現実的ではない。
確かに、エラーになれば、理想的だ。しかし、そんな機能は、exportと同様、主要な実装から、無視されるだけである。
もう一度いう。従来の例外指定は、現実的に無意味なため、廃止された。noexceptは、最適化へのヒントという役割のためだけに採用された機能である。
ただし、規格の文面は、コンパイル時のエラーを、禁止していない。つまり、優れた実装ならば、そのような機能を提供できる。現在、そのような意味を含めた文面を、明示的に追加するべきかどうか、議論中である。
No comments:
Post a Comment