为什么 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())
我在 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) {...}
orwhile(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())