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;
Но, поскольку многие Senior разработчики программного обеспечения видели этот код на протяжении многих лет, мне интересно, есть некоторые детали, которые мне не хватает. Есть ли какая-либо цель иметь std::flush
после std::endl
?
Для этого нет никакой цели.
Если бы мне пришлось размышлять о том, почему ваш старый код содержит эти строки, есть несколько возможностей, начиная с (что я считаю) наиболее вероятными сценариями:
std::flush
, и старшие разработчики не рассматривали его как проблему, требующую исправления.std::endl
не вызывала флеш, а это означало, что ваши старшие разработчики (правильно) понимали, что это необходимо.std::endl
для запуска флешаstd::endl
.<< '\n'
на<< std::endl
flush
. В лучшем случае некоторая ранняя версия стандартной библиотеки, возможно, вела себя по-другому, хотя я в этом сомневаюсь. Кстати, я могу придумать причину, по которой они будут использоватьendl
вместо'\n’
, несмотря на то, что не осознают, что это flushes, это система, которая не имеет терминатора LF-линии (скорее всего, Windows) , Конечно, это не обязательно дляcout
/cerr
, а не текстового режимаofstream
, а затем ещеendl
даже не помогает для двоичногоofstream
, но это, возможно, было ошибочной аргументацией.Я добавлю к другим действительным ответам, что очень часто для нет хорошей цели
std::flush
иstd::endl
.В принципе,
std::endl
= начать новую строку + очистить поток. Многие люди, однако, имеют тенденцию заканчивать свои строки с помощьюstd::endl
, потому что он "звучит правильно" - заканчивает линию. Но на самом деле нам редко нужно очищать выходной поток. Иногда мы это делаем (например, когда мы ожидаем ответа пользователя на строку или важно контролировать наш вывод с минимальной задержкой), но это исключение, а не правило.Итак, это может потребоваться немного привыкнуть, но мы должны по умолчанию просто:
и вот что!
std::cerr
, если вам нужен вывод, который нужно сбросить на терминал.В среде, совместимой со стандартами,
std::flush
не служит никакой полезной цели в этом коде.Тот, кто написал это, не полностью понял семантику
std::endl
, или работали над некоторыми ограничениями их компилятора или среды выполнения.