2010-11-27 18 views
9
#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 

    ifstream file0("file0.txt"); 
    ifstream file1("file1.txt"); 

    if (file0 != file1) { 
     cout << "What is being compared?" << endl; 
    } 

} 

上記のコードの場合、条件付きで比較されるものは何ですか?私はそれがポインタ値だと信じていますが、私は裏付けの証拠を見つけることができません。!=演算子とファイルストリーム

ありがとうございます!

+0

「ポインタが比較されている」というステップは、同等性をテストすることによって行うことができます。心配しないでください。 – Tom

答えて

4

ifstreamで比較を実行すると、operator void*が呼び出されます。 Visual Studioを使用している場合は、コードの逆アセンブリを表示することを選択すると、これを見ることができます。

オペレータはhereです。 あなたが言及した見ることができるように:

返されたポインタが参照されることを意図されていないエラーフラグのいずれも設定されていないときには、それだけで成功を示します。

ifstreamが両方とも失敗すると、それらは等しくなります。それらが成功すれば(私はポインタの値がどこから来るのかわかりませんが)ではなく、は[これはVSでテストされています]。

+1

コンパイラは演算子bool()より演算子void *()を選択する方法をどのように知っていますか?優先順位は何を定義しますか? – chrisaycock

+0

@chris:私は実際に同じことを考えていました。しかしそれは私の知識を超えています。 – Default

+2

ストリームには 'operator bool'がありません。返された 'void *'はbooleanコンテキスト( 'if(std :: cin)...')で暗黙的にboolに変換可能です。 – UncleBens