测试 istream 对象

testing an istream object

当我在测试中使用 std::istream 对象(在下面的示例中来自 cplusplus.com,std::ifstream)时:"if (myistreamobject)",该对象会自动分配在堆栈中的永远不会为空,对吗?...在​​下面的示例中,我们使用相同的测试来检查是否从文件中读取了所有字节...这真是一个奇怪的代码,我通常使用这种风格当我处理指针时...

我想知道在std::istream到return测试中使用了哪种机制,以及该值的真正含义...(最后一个操作的success/failure ??) 是 bool 转换的重载(就像 MFC class CString 中的 const char* 运算符转换)还是另一种技术?

因为对象永远不会为 null,所以将其放入测试中将始终 return 为真。

// read a file into memory
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream

int main () {

  std::ifstream is ("test.txt", std::ifstream::binary);
  if (is) {
    // get length of file:
    is.seekg (0, is.end);
    int length = is.tellg();
    is.seekg (0, is.beg);

    char * buffer = new char [length];

    std::cout << "Reading " << length << " characters... ";
    // read data as a block:
    is.read (buffer,length);

    if (is) // <== this is really odd
      std::cout << "all characters read successfully.";
    else
      std::cout << "error: only " << is.gcount() << " could be read";
    is.close();

    // ...buffer contains the entire file...

    delete[] buffer;
  }
  return 0;
}
if (expression)

对其进行测试 expression 计算结果为 true,这是一个布尔值。它适用于指针,因为 nullptr/NULL/0 的计算结果为 false,而其他一切为 true。出于同样的原因,它适用于整数值。

一个对象,落到operator bool(),见http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

Checks whether the stream has no errors.

1) Returns a null pointer if fail() returns true, otherwise returns a non-null pointer. This pointer is implicitly convertible to bool and may be used in boolean contexts.

2) Returns true if the stream has no errors and is ready for I/O operations. Specifically, returns !fail().

This operator makes it possible to use streams and functions that return references to streams as loop conditions, resulting in the idiomatic C++ input loops such as while(stream >> value) {...} or while(getline(stream, string)){...}.

Such loops execute the loop's body only if the input operation succeeded.

std::istream 已将运算符声明为正确的: explicit operator bool() const;

写的时候 if(SomeStdIstremObject) { ... } 确实在调用 if(SomeStdIstreamObject.operator bool()) 不检查非零

operator bool() 

returns 如果流没有错误则为真,否则为假。

无错误”概念与之前对流本身进行的操作有关。

例如:调用构造函数后

std::ifstream is ("test.txt", std::ifstream::binary);

设置了流对象中的内部状态标志。因此,当您调用运算符 bool 时,您会检查构造操作是否失败。

还有方法

is.read(...)

也设置这个内部状态标志,正如你在 reference:

中看到的

Errors are signaled by modifying the internal state flags: eofbit, failbit, badbit.

因此在方法调用之后,如果流到达 EOF(文件末尾),则设置状态位,并且运算符 bool 将 return 为正值。

这意味着在那种情况下,当您使用

测试流时
if (is) { ... }

并且设置了状态位,然后将验证条件并采用 if 分支。