spaaaark・∀・ さんが書きました:エラー処理となる例外機構でEOF検出ってしてもよいものなのでしょうか?
確かにこのコードはいちいちEOFが検出されたかどうかのコードを随所に書く必要がなくなるのですが、
友人曰くお勧めしないと言われたところにより気になった次第です。よろしくお願いします。
一般的ではありませんし,「例外」機構を使うべき所ではないと思います。
EOFは通常必ず起きる状況であって,特別な状況ではありません。
少なくとも,初回のEOFは例外無しで取得できるようにした方がよいでしょう。
# 例外原理主義的な,JavaですらEOFが例外で検出される構造にはなっていません。
beatle さんが書きました:C++の規格をちょっと調べたのですが、該当する記述が見つかりませんでしたので想像で書きます。
try開始から例外発生時までに行ったローカル変数への変更は、例外が発生してcatchに移動したときに保持されている保証は無いと思います。
例外が発生すると,最寄りの型が一致するcatchハンドラに「制御が移り」ます (ISO/IEC 14882:2011 15.1 ¶2)。
tryブロック開始から例外発生までのローカル変数のデストラクタは呼び出されますが (同 15.2 ¶3)。
この時,try ブロックの外側にあるローカル変数は,まだブロックの末尾に達していませんから,当然生存しています (同 3.7.3)。
オブジェクトが死んでいない以上,値が勝手に変更されることもありません。
beatle さんが書きました:setjmp/longjmpを用いて例外っぽい処理を書こうと思うと、まさにローカル変数への変更は担保されませんので、try-catchがsetjmp/longjmpを用いて実装されている処理系だと同様に担保されない可能性はあります。
setjmp/longjmpを実装として使うのは勝手ですが,勝手にオブジェクトを破棄してはいけません。