C++ C++;Ifstream对象等于nullptr,但它不是';不是指针吗?

C++ C++;Ifstream对象等于nullptr,但它不是';不是指针吗?,c++,C++,我正在尝试使用ifstream打开文件失败的测试程序。代码如下:- #include <iostream> #include <fstream> #include <type_traits> using namespace std; int main() { ifstream ifs ("wrong_filename.txt"); cout << boolalpha; cout << is_pointer<

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

<> > <代码> IFS<代码>不是<代码>指针<代码>,那么它如何等于<代码> nulpPTR< /C> > /p>< P>直到C++ 11、C++流隐式转换为Value*/Cuff>。如果流未处于无错误状态,则结果将为
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.";

@CppNITR您需要一个布尔上下文,即触发显式布尔转换的上下文。例如,转换为
bool
、一个
if
条件或
For
头的
的第二部分。@CppNITR可以工作,并且应该在每个符合要求的实现上都可以工作。“因为您的代码显然至少是C++11,所以您的编译器接受它是不符合要求的。”可能使用GCC 4.x中的libstdc++,它支持C++11的功能,例如
nullptr
,但是直到GCC 5之前,我们没有用
显式运算符bool
替换
运算符void*
。@hvd,真的吗?!G++不允许,但Clang和EDG允许。@hvd,我认为Clang对于类类型拒绝它是正确的,但是对于
bool
接受它是正确的,GCC是错误的。请参见Richard引用[over.best.ics]p4的地方
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
}