gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:09:02 26 4
gpt4 key购买 nike

谁能给我解释一下这是怎么回事...?

我有这段代码:

#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";
}
}

...编译正常,做它应该做的,到目前为止没问题。有时候我不太喜欢!,因为它很容易被忽略,所以我把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;

这会导致以

开头的错误 Storm
error: no match for ‘operator==’ (operand types are ‘std::basic_istream<char>’ and ‘bool’)
if ((file>>x)==true) return 0;
^

现在我完全迷路了。 falsetrue 有何不同?当然有不同的值,但我一直认为 truefalse 是同一类型。

最佳答案

回想一下 C++ 有运算符重载。特别是,std::basic_istream overloads operator! .

唉,没有强制操作符重载在语义上是一致的,所以 istreambool 之间的 == 没有重载>。因此与 true 的比较失败。然而,编译器也被允许应用隐式转换以使表达式编译 - 在这种情况下 false 可能被隐式转换为空指针,并且 basic_istream 有一个overload of operator void* (虽然显然在 C++11 中它被替换为 operator bool - 大概是为了修复不一致)。

关于c++ - 将 false 转换为指针类型 void*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43864832/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com