std::flush
,就在我正在查看的遗留代码中使用了std::endl
之后。当我第一次看到这个时,我认为它是多余的,因为它查看了std::endl
和std::flush
的描述:
http://en.cppreference.com/w/cpp/io/manip/endl
http://en.cppreference.com/w/cpp/io/manip/flush
下面是我在遗留源代码中看到的一个示例:
std::cout << "Generic Notification" << std::endl << std::flush;
但是,由于许多高级软件开发人员多年来都见过这段代码,我想知道我是否遗漏了一些细节。在std::endl
之后有std::flush
有什么意义吗?
3条答案
按热度按时间shyt4zoc1#
它没有任何意义。
如果我不得不推测为什么遗留代码包含这些行,有几种可能性,从(我认为的)最可能的场景开始:
std::flush
的显式调用,高级开发人员不认为这是需要修复的问题std::endl
的实现没有触发刷新,这意味着您的高级开发人员(正确地)理解了刷新的必要性std::endl
来触发刷新std::endl
的行为。9w11ddsr2#
我将在其他有效答案的基础上补充一点,即通常情况下,*
std::flush
和std::endl
都没有好的目的。基本上,
std::endl
=开始一个新行+刷新输出流。但是,很多人倾向于用std::endl
来结束他们的行,因为它"听起来很正确"--结束该行。但是,我们实际上很少需要刷新输出流。有时我们确实需要(例如,当我们期待用户对字符串的回复时,或者重要的是以最小的延迟监控我们的输出)-但这是例外,而不是规则。因此,可能需要一点时间来适应,但我们真的应该简单地默认为:
就这样!
uyhoqukh3#
在符合标准的环境中,
std::flush
在此代码中没有任何用处。不管是谁写的,要么没有完全理解
std::endl
的语义,要么是在解决编译器或执行环境的一些限制。