C++ 如果流对象等于 nullptr,但它不是指针?
C++ Ifstream object equals nullptr but it isn't a 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;
}
输出为:-
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
}
相关文章:
- 将指针设置为"nullptr"并不能防止双重删除?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- boost::spirit指针属性是用nullptr初始化的吗?
- unique_ptr<T>::get() 返回的指针在原始unique_ptr被销毁后不是 nullptr
- 在C++中将指针数组的所有元素设置为 nullptr
- 以原子方式交换指针与 nullptr
- 指向抽象类的指针数组:指向 nullptr 或不指向 nullptr (C++)
- 仅当指针不是 nullptr 时才调用方法
- C++链表指针始终为 nullptr
- 为什么分配了 nullptr 的指针可以调用成员函数?
- 空向量占用的空间是否与指向当前设置为 nullptr 的类型的指针一样多
- 如何使用nullptr初始化同一类对象的静态指针数组?
- 为什么我不能使用 nullptr 初始化自动推导的指针?
- std::unique_ptr 是否在其析构函数中将其基础指针设置为 nullptr?
- 我可以得到指向 nullptr 的指针的指针吗,它是否有效
- C++ 仅设置对象指向 nullptr 的指针
- 指向自定义类型的静态指针在初始化后使用相同类型的静态非空指针保持 nullptr