11

std::flushstd::endl在我正在查看的所有遗留代码中使用a 之后。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::flushafter a有什么目的std::endl吗?

4

3 回答 3

13

它没有任何目的。

如果我不得不推测为什么您的遗留代码包含这些行,那么有几种可能性,从(我认为是)最可能的场景开始:

  • 有人std::flush错误地添加了显式调用,高级开发人员不认为这是一个需要修复的问题
  • 该代码起源于 C++ 标准被广泛采用之前的一段时间,并且在那个时候,本地编译器的实现std::endl没有触发刷新,这意味着您的高级开发人员(正确地)理解这是必要的
  • 旧版本的 C++ 标准可能不需要std::endl触发刷新
  • 您的高级开发人员对std::endl.
  • 您的执行环境是一个奇怪的庞然大物,实际上需要刷新输出两次才能获得预期的结果。
于 2018-06-05T18:51:16.310 回答
6

我将添加到其他有效答案中,通常情况下,两者都 std::flush没有好的目的std::endl

基本上,std::endl=开始新行+刷新流。但是,很多人倾向于以std::endl“听起来正确”来结束他们的台词——结束台词。但我们实际上很少需要刷新输出流。有时我们会这样做(例如,当我们期待用户对字符串的回复,或者以最小的延迟监控我们的输出很重要时) - 但这是例外,而不是规则。

所以,这可能需要一点时间来适应,但我们应该默认简单地:

std::cout << bunch_of_stuff << '\n';

就是这样!

于 2018-06-05T19:06:17.443 回答
5

在符合标准的环境std::flush中,此代码没有任何用处。

写这篇文章的人要么不完全理解std::endl.

于 2018-06-05T18:50:22.890 回答