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

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

本文关键字:gt 有效 while ifstream 为什么 std      更新时间:2023-10-16

我在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>>的返回值,它是一个istream对象,而不是布尔值。istream对象如何以某种方式被解释为可以放入if语句和while循环中的布尔值?

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

一个条件表达式表示一个显式布尔转换,所以这个:

while (in >> s)

相当于这个

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

相当于这个

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

相当于

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

std::basic_ios是输入流和输出流的继承源,它具有转换函数operator bool(或C++11之前的operator void*,以绕过安全布尔问题,由于explicit关键字,安全布尔问题不再是问题)。

请参阅std::basic_ios::operator bool:

此运算符可以使用流和返回对流的引用的函数作为循环条件,从而产生惯用的C++输入循环,如while(stream >> value) {...}while(getline(stream, string)){...}。只有当输入操作成功时,这样的循环才会执行循环的主体。