为什么 while(std::ifstream >> s) 有效?

Why does while(std::ifstream >> s) work?

我在 C++ 编程中经常使用这样的语句:

std::string s;
std::ifstream in("my_input.txt");
if(!in) {
    std::cerr << "File not opened" << std::endl;
    exit(1);
}
while(in >> s) {
    // Do something with s
}

我想知道的是,为什么这样做有效?

我查看了 operator>> 的 return 值,它是一个 istream 对象,而不是布尔值。 istream 对象如何以某种方式被解释为可以放入 if 语句和 while 循环中的 bool 值?

std::basic_ios,输入流和输出流继承自,具有转换函数operator bool (or operator void* prior to C++11 to get around the safe-bool problem,由于explicit关键字,这不再是问题)。

std::basic_ios::operator bool:

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.

基础 class std::basic_ios 提供了一个 operator bool() 方法,该方法 returns 一个表示流有效性的布尔值。例如,如果读取到达文件末尾但未获取任何字符,则将在流中设置 std::ios_base::failbit。然后 operator bool() 将被调用,返回 !fail(),此时提取将停止,因为条件为假。

条件表达式表示显式布尔转换,因此:

while (in >> s)

相当于这个

while (static_cast<bool>(in >> s))

相当于这个

while ((in >> s).operator bool())

相当于

while (!(in >> s).fail())