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

时间:2015-02-13 17:28:24

标签: c++ stl

我在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循环中的bool值?

3 个答案:

答案 0 :(得分:7)

基类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())

答案 1 :(得分:5)

输入和输出流从中继承的

std::basic_ios在C ++ 11之前具有转换函数operator bool(或operator void*来绕过safe-bool problem,由于explicit关键字,这不再是问题。

答案 2 :(得分:3)

请参阅std::basic_ios::operator bool

  

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