Имеет ли цель std :: endl << std :: flush? - PullRequest
0 голосов
/ 05 июня 2018

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::flush после std::endl?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Для этого нет цели.

Если бы мне пришлось размышлять о том, почему ваш старый код содержит эти строки, есть несколько возможностей, начиная с (как я считаю, наиболее вероятных сценариев):

  • Кто-то по ошибке добавил явный вызов к std::flush, и старшие разработчики не сочли это проблемой, требующей исправления
  • Код был создан в то время, когда стандарт C ++ был широко распространен.принял, и в то время, реализация локального компилятора std::endl не вызывала сброса, что означало, что ваши старшие разработчики (правильно) понимали, что это необходимо
  • Более старая версия стандарта C ++ могла быне требуется std::endl для запуска сброса
  • Ваши старшие разработчики ошибаются из-за поведения std::endl.
  • Ваша среда выполнения - странный бегемот, который на самом деле требует, чтобы выходные данные дважды очищалисьдо желаемого результата можно ожидать.
0 голосов
/ 05 июня 2018

Я добавлю к другим действительным ответам, которые очень часто не имеют смысла для либо std::flush, ни std::endl.

В основном, std::endl = начать новую строку + очистить поток.Однако многие люди заканчивают свои строки std::endl, потому что это «звучит правильно» - заканчивайте строку.Но на самом деле нам редко нужно очищать поток вывода.Иногда мы это делаем (например, когда ожидаем ответа пользователя на строку или важно отслеживать наш вывод с минимальной задержкой) - но это исключение, а не правило.

Итак, это может занятьнемного привыкнуть, но мы должны по умолчанию просто:

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

и все!

0 голосов
/ 05 июня 2018

В среде, соответствующей стандартам, std::flush не имеет смысла в этом коде.

Кто бы это ни написал, либо он не полностью понимал семантику std::endl, либо работал над некоторым ограничениемих компилятор или среда выполнения.

...