2010-11-28 12 views
8

this questionと答えると、私は本当に私を混乱させる研究をしました。演算子優先順位(boolより前のvoid *)

正常にオープンした2つのifstreamは同じではなく、2つのifstreamが失敗していることに気付きました。 最初に私はcplusplus.comをチェックしました。 operator !はbadbitとfailbitのステータスを返します。私はこれとは逆のことが、まだこの2つのビットの状態を返すことになると思うが、反転したと思う。間違っ

  • 二成功し呼び出しが等しくないからです。

それで、私はそれが何かを返すだろうoperator boolだと考えました。だから私はifstreamからバックトラックしようとしてを返すistream::operator bool()を見つけました。それでも、間違った

  • しかし(2つの成功した呼び出しがまだ同じではないので、となることができませんでした)、これはまったく呼び出されていないようです。

私はアプローチを変更し、Visual Studioから逆アセンブリを確認しました。そして私は何を見つけるのですか?
if (file0 != file1) {operator bool(),とは呼ばず、operator void*()(実際は__imp_std::ios_base::operator void *)と呼ばれます。

ので

  • 任意のoperator bool()は、ポインタ値にキャストしようとする前に呼び出すことが見出されないなら、私がある持っている質問..?
  • それはいくつかですかoperator bool()私はそれを逃したのですが、operator void*と呼んでいますか?
  • これは私が理解していない最適化ですか?

  • または私は実際にvoid*は、この比較においてboolよりも一致でことを考えているC++ で完全に間違っているのですか?

答えて

2

1.)複数回はオーバーロードすることはできませんが、戻り値のタイプは異なります。 2.)はい、operator!はbadbit/failbitを返しますが、operator!は、使用しているoperator!=とはまったく異なるものです。

+0

ああ、そうです。ありがとう、私はここで私は疲れている感じている。私はこれについて質問をしています:)多分あなたは[this one](http://stackoverflow.com/q/4294873/238902 "operator void *とoperator boolの両方を定義する")と答えることができます。 – Default

+0

しかし、ifstreamは実際にoperator!=ではなくoperator *を呼び出しています。 – Default

関連する問題