C++ 如果流对象等于 nullptr,但它不是指针?

C++ Ifstream object equals nullptr but it isn't a pointer?

本文关键字:指针 nullptr 如果 对象 C++      更新时间:2023-10-16

我正在尝试使用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模式下的当前编译器会实时拒绝您的代码片段。因为你的代码显然至少是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
}