gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:26:31 24 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 一起使用,见下文)将找到并使用该转换,并且由于您的文件名错误,比较将产生 true。

在 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/33187086/

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