- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ストリームオブジェクトによるエラー判定)
ストリームオブジェクトによるエラー判定
このQ&Aのポイント
- C++でストリームオブジェクトを使用する際に、エラー判定を行う方法について質問があります。
- 林晴比古著「明快入門C++(シニア編)」(2008年8月、初版)には、ストリームオブジェクトを使用したエラー判定の方法が記載されています。
- 質問者は、記述例として示されている(fout)と(!fout)でのエラー判定方法が理解できないと述べています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
正しく言うと, そこで定義しているのは「void * への変換演算子」と「! 演算子」です. 「() 演算子」ではない (これは別のもの) ですし, 「!() 演算子」でもない (というか, そんな演算子は存在しない) です. で, ! 演算子を定義することによって「!fout」と書けるようになります. これは fout.operator !() と同じで, bool を返すとなっているのでそのまま if の条件として使うことができます. 一方「fout を if の条件に書ける」というのは ! 演算子の多重定義とは関係ありません. ここはちょっと手間がかかっているんですが, まず「if の条件式」は最終的に bool で評価されます. つまり「bool に変換できるもの」であればよいのですが, このときには「言語に組み込みの変換を高々 1回, ユーザ定義の変換を高々 1回」で bool に変換できることが必要だったはず. 今の場合だと, 直接 bool に変換する演算子 operator bool はないけど, void * に変換する演算子 operator void * が定義されていて void * は bool に変換できるので fout.operator void *() != 0 と同じ意味で使っています.
お礼
Tacosan様 さっそく的確なご回答を頂きまして、有難うございました。 理解できました。 「変換関数」がC++の専門用語だと言う事を知らなかったため(本書籍の403ページに記述がありました)、変換関数の書式 operator 型() { return 式;} を、演算子の多重定義をしているものだと勝手に考えてしまっていました。 「!」演算子の話は言われてみればその通りで、(fout)の処で初めに悩んでしまい、頭が混乱していました。 どうも有難うございました。