2013-11-02 25 views
2

我對如何/爲什麼可以在條件中使用istream有一個脆弱的理解。我讀過這個問題:(Why istream object can be used as a bool expression?)。這個比較爲什麼不bool爲istream工作?

我不明白爲什麼這個編譯沒有錯誤...

while (cin >> n) { 
    // things and stuff 
} 

......而這無法編譯(消息error: invalid operands to binary expression ('int' and '__istream_type' (aka 'basic_istream<char, std::char_traits<char> >'))

while (true == (cin >> n)) { 
    // things and stuff 
} 
+0

這是哪個編譯器? – chris

+0

libC++,我想。 (Xcode和/或CodeRunner) – griotspeak

+0

那麼,我主要關心的是它說'int'而不是'bool'。無論如何,應該有一個明確的轉換運算符來「布爾」,但我認爲任何實現都沒有。 – chris

回答

2

由於cin隱式轉換操作符是

operator void*() const { ... } 

它可以評估爲零,所以你可以檢查它,零

while (cin >> x) {} 

轉換運營商bool聲明explicit使你的表達就不會調用它:

explicit operator bool(){ ... } 

所以,你需要一個明確的轉換:

if (true == static_cast<bool>(cin >> a)) 
{ 
} 
+0

還有一個'operator bool()'。 – 0x499602D2

+1

@ 0x499602D2,也可能有點多。它在C++ 11中被*改爲'explicit operator bool()'。 – chris

+0

有趣。我想我可能不得不施放,但不明白爲什麼。謝謝。 (目前還不能接受答案。) – griotspeak

0

cin >> n返回istream&。由於結果用於比較,編譯器會搜索它找不到的operator==(bool, istream)。因此,您收到錯誤消息。