gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:13:27 27 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不是指针,那么它如何等于nullptr

最佳答案

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

在 C++11 中,这被更改为显式转换为 boolfalse 表示错误,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/39077869/

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