【C++】为什么可以while(std::cin >> input)
发布日期:2021-06-24 18:23:02 浏览次数:3 分类:技术文章

本文共 1038 字,大约阅读时间需要 3 分钟。

前几天在回答问答栏目的问题时,犯了一个错误,本文章是关于错误原因的分析。

我将问题中的程序简化为以下代码:

#include 
int main() { std::string input; while (std::cin >> input) { std::cout << input << std::endl; }}

当时我认为while循环会一致循环下去,因为>>操作符的重载是这样的:

clipboard.png

总是返回basic_istream的引用,因为不为空,所以转换成true。可转念一想,以前我也这么写过,而且很多人也这么写,应该理解有误,故重新审视这个问题。

std::cin >> input控制着循环的执行,下面按表达式执行顺序分两步说明:

第一步:提取操作符重载

如上图所示,>>操作符将字符串读入input之后,会返回basic_istream的引用。这个引用是非空的,如果仅仅到这一步,肯定会返回true的。然而,C++的标准库做了一个特殊处理,进入下一步。

第二步:转换操作符重载

cin<iostream>声明如下:

extern std::istream cin;
且,istreambasic_istream<char>的别名,所以cin实际上也继承了基类basic_istream<>的成员和成员函数。

而,basic_istream有关于转换操作符的重载:

clipboard.png

如果输入流没有错误,第一个函数(C++11之前的版本)会返回非NULL指针(在while里又再次转换为true),第二个函数会返回true

当然我们可以用以下的测试程序验证我们的结论,我们手工用setstate函数设置了输入流的状态:

#include 
int main() { std::string input; while (std::cin >> input) { std::cout << input << std::endl; std::cin.setstate(std::ios_base::failbit); }}

这个时候,循环结束。所以,whilestd::cin >> input的返回是跟流的状态相关的。

综上,之所以犯错,主要是因为第二步的转换操作符“作祟”,C++的隐式转换在某种程度上会带来理解的成本,使用时要加倍小心。

关注我的公众号哈

clipboard.png

转载地址:https://blog.csdn.net/weixin_34248258/article/details/88690484 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:前端技术周刊 2018-12-03:DOM
下一篇:双11奇迹背后的大数据平台,不喧哗,自有声!

发表评论

最新留言

很好
[***.229.124.182]2024年04月02日 09时53分58秒