有人可以解释一下这里发生了什么......?
我有这段代码:
#include <fstream>
#include <string>
#include <iostream>
int main(){
std::ifstream file("test.txt");
std::string x;
while (true) {
if (!(file >> x)) return 0;
std::cout << x << "\n";
}
}
...编译好,做它应该做的,到目前为止没问题。有时候我不喜欢!
这么多,因为它很容易被忽略,所以我用{/ 1>替换了if
if ((file >> x)==false) return 0;
..突然我的编译器(gcc 4.8.5)抱怨警告:
warning: converting ‘false’ to pointer type ‘void*’ [-Wconversion-null]
if ((file >> x)==false) return 0;
这就是我开始感到困惑的地方。 void*
来自哪里?不>>
会返回应该投放到bool
的引用吗?为什么false
已转换为void*
?当我不明确写false
时,为什么不会触发相同的警告?
出于好奇,我也试过了:
if ((file>>x)==true) return 0;
导致以
开头的错误风暴error: no match for ‘operator==’ (operand types are ‘std::basic_istream<char>’ and ‘bool’)
if ((file>>x)==true) return 0;
^
现在我完全迷失了。 false
与bool
有何不同true
?当然不同的值,但我一直认为true
和false
属于同一类型。
答案 0 :(得分:7)
回想一下C ++有运算符重载。特别是std::basic_istream
they accept parameters。
唉,运营商重载在语义上并不一致,因此==
和istream
之间bool
没有重载。因此,与true
的比较失败。但是,也允许编译器应用隐式转换以使表达式编译 - 在这种情况下,false
可以隐式转换为空指针,basic_istream
具有overloads operator!
(虽然显然在C ++ 11中用operator bool
替换了 - 用于修复不一致的预设。)