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

时间:2015-10-17 13:17:50

标签: c++

我正在尝试使用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

1 个答案:

答案 0 :(得分:22)

在C ++ 11之前,C ++流可以隐式转换为void*。如果流不处于无错误状态,则结果为NULL,如果不是,则结果为ifs == NULL。因此,nullptr(不应与bool一起使用,请参阅下文)将查找并使用该转换,并且由于您的文件名错误,因此比较结果为true。

在C ++ 11中,这已更改为显式转换为falsetrue表示错误,void*为良好的流,因为if ( !(ifs >> data) ) std::cout << "Reading data failed."; 转换允许太多无意义的代码,例如你的例子。实际上,C ++ 11或C ++ 14模式下的当前编译器将拒绝您的代码段live。由于您的代码显然至少是C ++ 11,因此您的编译器接受它是不符合的。

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

std::ifstream ifs ("wrong_filename.txt");
if (!ifs)
    std::cout << "Could not open file.";

或者,类似于您的示例:

for (std::string line; std::getline(ifs, line);) {
    // Process line
}

当天有趣的事实:您也可以使用它来干净地循环文件,例如:

#include<iostream>
using namespace std;

int main()
{
    int n, sum = 0;
    while(n != 0)
    {
        cout << "Enter number :";
        cin >> n;

        if(n <= 0)
            break;

        sum += n;
    }