将false转换为指针类型void *?

时间:2017-05-09 08:29:57

标签: c++ stream boolean type-conversion

有人可以解释一下这里发生了什么......?

我有这段代码:

#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;
              ^

现在我完全迷失了。 falsebool有何不同true?当然不同的值,但我一直认为truefalse属于同一类型。

1 个答案:

答案 0 :(得分:7)

回想一下C ++有运算符重载。特别是std::basic_istream they accept parameters

唉,运营商重载在语义上并不一致,因此==istream之间bool没有重载。因此,与true的比较失败。但是,也允许编译器应用隐式转换以使表达式编译 - 在这种情况下,false可以隐式转换为空指针,basic_istream具有overloads operator!(虽然显然在C ++ 11中用operator bool替换了 - 用于修复不一致的预设。)