2010-03-31

例外指定について

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

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

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

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

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

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

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

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

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

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

No comments:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.