gpt4 book ai didi

C++ Ifstream 对象等于 nullptr 但它不是指针?

转载 作者:行者123 更新时间:2023-12-02 11:01:01 25 4
gpt4 key购买 nike

我正在尝试使用 ifstream 打开文件失败的测试程序.代码如下:-

#include <iostream>
#include <fstream>
#include <type_traits>
using namespace std;
int main()
{
ifstream ifs ("wrong_filename.txt");
cout << boolalpha;
cout << is_pointer<decltype(ifs)>::value <<"\n";
cout << (ifs==nullptr);
return 0;
}

输出是:-
false
true

ifs不是 pointer ,那么它怎么等于 nullptr ?

最佳答案

在 C++11 之前,C++ 流可以隐式转换为 void* .结果将是 NULL如果流不是处于无错误状态,如果是其他状态。所以ifs == NULL (不应该与 nullptr 一起使用,见下文)将找到并使用该转换,并且由于您的文件名错误,比较结果为真。

在 C++11 中,这被更改为显式转换为 bool , 与 false指示错误和 true一个很好的流,因为void*转换允许太多无意义的代码,例如您的示例。实际上,当前处于 C++11 或 C++14 模式的编译器会拒绝您的代码片段,live .由于您的代码显然至少是 C++11,因此您的编译器接受它是不合格的。

这些转换允许并用于如下错误检查:

if ( !(ifs >> data) )
std::cout << "Reading data failed.";

或者,类似于您的示例:
std::ifstream ifs ("wrong_filename.txt");
if (!ifs)
std::cout << "Could not open file.";

当天有趣的事实:您还可以使用它来干净地循环文件,例如:
for (std::string line; std::getline(ifs, line);) {
// Process line
}

关于C++ Ifstream 对象等于 nullptr 但它不是指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40624537/

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