std::endl << std::flush 有目的吗?

Does std::endl << std::flush have a purpose?

std::flush 就在 std::endl 用于我正在查看的遗留代码之后。当我第一次看到这个时,我的想法是查看 std::endlstd::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 有什么意义吗?

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

写这篇文章的人要么没有完全理解 std::endl 的语义,要么正在解决他们的编译器或执行环境的某些限制。

没有目的。

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

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

我会在其他有效答案中补充一点,通常 std::flushstd::endl 都没有好的目的。

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

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

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

就是这样!