为什么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>>
的返回值,它是一个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)){...}
。只有当输入操作成功时,这样的循环才会执行循环的主体。
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- EASTL矢量<向量<int>>连续的
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 如何有效地在 std::vector 中插入一对?
- C++模板 t 不是有效的模板类型
- 检查由括号、方括号和大括号组成的一组方括号是否有效?