2010-03-31

例外指定について

そもそも、例外指定をdeprecatedにする意味は、例外指定が、現実の世界では、全く役に立たなかったからである。

noexceptの目的は、関数は例外を投げないと明示することより、コンパイラに、最適化のヒントを与えるものである。静的なソースコードの解析が目的ではない。

例外指定の、かつての目的は、単なるシンタックスシュガーであった。最適化のヒントは、全く意図していなかったのである。

なぜ、現実世界では、例外指定は、笑えるほどに失敗したのか。テンプレート引数がどのような型なのか、わからないからである。

template < typename T >
void f( T x ) 
{
// Tのコピーコンストラクタが例外を投げるかもしれない。
}

このようなコードで、例外指定で、実際に投げる例外を指定出来るわけがない。

では、noexceptを指定したコードで、例外を投げるパスがある場合、コンパイラはエラーを出すべきであるという意見はどうか。これは、非現実的である。そのためには、翻訳単位を超えた、大規模な静的解析が必要である。すべてのコンパイラに、そのような実装を求めるのは、現実的ではない。

確かに、エラーになれば、理想的だ。しかし、そんな機能は、exportと同様、主要な実装から、無視されるだけである。

もう一度いう。従来の例外指定は、現実的に無意味なため、廃止された。noexceptは、最適化へのヒントという役割のためだけに採用された機能である。

ただし、規格の文面は、コンパイル時のエラーを、禁止していない。つまり、優れた実装ならば、そのような機能を提供できる。現在、そのような意味を含めた文面を、明示的に追加するべきかどうか、議論中である。

No comments: