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

时间:2018-06-05 18:46:31

标签: c++ flush endl

在我正在查看的遗留代码中使用export class AppComponent { clone(){ Need to clone #component-outer div and append below the last instance of that div, then append the div name on the cloned element. } } 之后

std::flush。当我第一次看到这个时,我的想法是,在查看std::endlstd::endl的描述是多余的:

http://en.cppreference.com/w/cpp/io/manip/endl

http://en.cppreference.com/w/cpp/io/manip/flush

以下是我在遗留源代码中看到的一个示例:

std::flush

但是,由于许多高级软件开发人员多年来都看过这个代码,我想知道是否有一些我遗漏的细节。在std::cout << "Generic Notification" << std::endl << std::flush; 之后有std::flush是否有任何目的?

3 个答案:

答案 0 :(得分:11)

没有任何目的。

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

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

答案 1 :(得分:5)

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

无论是谁写的都不完全理解std::endl的语义,或者正在解决其编译器或执行环境的某些限制。

答案 2 :(得分:4)

我会添加其他有效的答案,通常情况下, <{em> std::flushstd::endl的目的都不是很好。

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

所以,可能需要一些习惯,但我们应该默认为:

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

那就是那个!