Имеет ли цель 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
или работали вокруг некоторого ограничения их компилятора или среды выполнения.