我在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值?
答案 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)){...}
。只有在输入操作成功时,这样的循环才会执行循环体。