Имеет ли цель std::endl << std::flush?

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 ответа

Решение

Там нет цели для этого.

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

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

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

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

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

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

и это все!

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

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

Другие вопросы по тегам