Spec-Zone.ru › C++

Именуемые требования C++: FormattedOutputFunction

Требования

FormattedOutputFunction — это функция вывода в поток, которая выполняет следующие действия:

  • Создаёт объект типа basic_ostream::sentry с автоматическим временем хранения, который выполняет следующие действия:
    • если в выходном потоке установлены eofbit или badbit, устанавливает также failbit; если в маске исключений этого выходного потока включены исключения для failbit ((exceptions() & failbit) != 0), выбрасывает ios_base::failure.
    • сбрасывает связанный с ним выходной поток, если это применимо.
  • Проверяет состояние объекта sentry, вызывая sentry::operator bool(), что эквивалентно basic_ios::good.
  • Если объект sentry вернул false или его конструктор выбросил исключение, вывод не выполняется.
  • Если объект sentry вернул true, пытается выполнить требуемый вывод, вставляя символы в выходной поток, как если бы был вызван rdbuf()->sputc(). Также можно использовать другие открытые члены std::basic_ostream, но виртуальные члены rdbuf(), за исключением overflow(), xsputn() и sync(), вызваны не будут.
    • Если вывод не удалось выполнить, устанавливает failbit. Если в маске исключений этого потока включены исключения для failbit ((exceptions() & failbit) != 0), выбрасывает ios_base::failure.
    • Если во время вывода выбрасывается исключение, устанавливает badbit в выходном потоке. Если в маске исключений этого потока включены исключения для badbit ((exceptions() & badbit) != 0), исключение также выбрасывается повторно.
    • Если исключение не выброшено, возвращает *this.
  • В любом случае — как при завершении из-за исключения, так и при возврате — деструктор объекта sentry вызывается до выхода из этой функции.

Заполнение

Функции форматированного вывода определяют заполнение согласно этапу 3 std::num_put::do_put().

(до C++14)

Если функция форматированного вывода потока os определяет заполнение, она делает это следующим образом.

Пусть дана последовательность символов типа CharT — seq, где CharT — это тип контейнера символов для os. Если длина seq меньше os.width(), в последовательность добавляется необходимое количество копий os.fill(), чтобы её ширина составила os.width() символов.

Если (os.flags() & std::ios_base::adjustfield) == std::ios_base::left имеет значение true, символы заполнения помещаются после последовательности символов; в противном случае они помещаются перед ней.

(начиная с C++14)

Стандартная библиотека

Следующие функции стандартной библиотеки являются FormattedOutputFunctions.

  • basic_ostream::operator<<(std::basic_ostream&, int / long / double / void* / bool)
  • operator<<(std::basic_ostream&, char)
  • operator<<(std::basic_ostream&, char*)
  • operator<<(std::basic_ostream&, const std::bitset&)
  • operator<<(std::basic_ostream&, const std::basic_string&)
  • operator<< , при вызове для возвращаемого значения std::put_money
  • operator<<(std::basic_ostream&, std::basic_string_view)
(начиная с C++17)
  • print(std::ostream&, std::format_string<Args...>, Args&&...),
  • println(std::ostream&, std::format_string<Args...>, Args&&...),
  • vprint_unicode(std::ostream&, std::string_view, std::format_args),
  • vprint_nonunicode(std::ostream&, std::string_view, std::format_args),
за исключением следующих случаев (где os — объект выходного потока):
  • любое исключение, выброшенное при вызове std::vformat, передаётся дальше независимо от значения os.exceptions() и без установки ios_base::badbit в состоянии ошибки os;
  • если вставка в os завершается неудачно, вызывается os.setstate(ios_base::badbit) (который может выбросить ios_base::failure).
(начиная с C++23)

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.

DR Применяется к Опубликованное поведение Правильное поведение
LWG 160 C++98 при определении того, следует ли
повторно выбрасывать перехваченное исключение, упоминалась несуществующая функция exception()
исправлено на exceptions()
LWG 165 C++98 единственным виртуальным членом, который разрешалось
вызывать для rdbuf(), был overflow()
также разрешалось вызывать
xsputn() и sync()

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/FormattedOutputFunction

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API