istream(ostream)对比布尔

use*_*406 6 c++ types casting

这是一个C++代码,它从给定的文本文件中读取尽可能多的单词,直到它满足EOF.

string text;
fstream inputStream;


inputStream.open("filename.txt");

while (inputStream >> text)
    cout << text << endl;

inputStream.close();
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 将while循环的条件(即inputStream >> text)转换为布尔值(即true或false)后,究竟执行了什么程序?

我对这个问题的回答是:

  • 据我所知,inputStream >> text应该返回另一个(文件)输入流.当EOF到达时,流似乎为NULL.NULL可以定义为0,等于false.

我的回答有意义吗?即使我的回答确实有意义,将InputStream转换为bool也不会让我感到舒服.:)

use*_*267 12

将while循环的条件(即inputStream >> text)转换为布尔值(即true或false)后,究竟执行了什么程序?

operator>> 返回对流的引用.

在C++ 11中,引用然后bool通过流的operator bool()函数转换为a ,返回等效的!fail().

在C++ 98中,通过使用来实现同样的目的operator void*(),并且返回的指针要么NULL指示失败,要么返回非空指针if if fail(),然后boolwhile评估中隐式转换为a .

  • 只是对于OP的一个FYI - 在C++ 11之前使用`operator void*()`的原因是为了避免偶然编译可疑的代码,比如`stream1 << stream2`或`stream1 + stream2`,让每个流产生一个` bool`,然后将那些转换为整数(`true`->`1`,`false`->`0`)进行可能非预期的积分运算.C++ 11实际上有`explicit operator bool()` - 这个新支持的`explicit`使用禁止在布尔上下文之外进行转换.`void*`s没有出色地工作 - "stream1 <stream2`仍然是合法的 - 但`explicit`修复了这一点. (5认同)
  • @ user3509406如果此答案解决了您的问题,请按左侧的绿色对勾接受它。 (2认同)