Spec-Zone.ru › C++

std::vprint_unicode(std::ostream)

Определён в заголовочном файле <ostream>
void vprint_unicode( std::ostream& os,
                     std::string_view fmt, std::format_args args );
(начиная с C++23)

Форматирует args в соответствии со строкой формата fmt и записывает результат в выходной поток os. Ведёт себя как функция форматированного вывода для os, за исключением того, что некоторые детали обработки ошибок отличаются.

Выполняет следующие операции по порядку:

  1. Сначала функция создаёт и проверяет объект sentry.
  2. Инициализирует автоматическую переменную, как если бы это выполнялось с помощью std::string out = std::vformat(os.getloc(), fmt, args);.
  3. Записывает out в os:
  • Если os ссылается на терминал, способный отображать Unicode только с помощью собственного API Unicode, сбрасывает os и записывает out в терминал с помощью собственного API Unicode.
  • В противном случае вставляет последовательность символов [out.begin(), out.end()) в os.

Если запись в терминал или вставка в os завершается неудачей, вызывает os.setstate(std::ios_base::badbit).

После записи символов в os устанавливает наблюдаемую контрольную точку.

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

Если out содержит недопустимые единицы кода Unicode кодовые единицы при использовании собственного API Unicode, поведение не определено.

Параметры

os - выходной поток, в который вставляются данные
fmt - объект, представляющий строку формата. Строка формата состоит из
  • обычных символов (кроме { и }), которые без изменений копируются в выходные данные,
  • управляющих последовательностей {{ и }}, которые заменяются соответственно на { и } в выходных данных, и
  • полей замены.

Каждое поле замены имеет следующий формат:

{ arg-id (необязательно) } (1)
{ arg-id (необязательно) : format-spec } (2)
1) поле замены без спецификации формата 2) поле замены со спецификацией формата
arg-id - задаёт индекс аргумента в args, значение которого используется для форматирования; если он опущен, аргументы используются по порядку.

Все arg-id в строке формата должны быть либо указаны, либо опущены. Смешение ручной и автоматической индексации является ошибкой.

format-spec - спецификация формата, определённая специализацией std::formatter для соответствующего аргумента. Не может начинаться с }.
  • Для базовых типов и стандартных строковых типов спецификация формата интерпретируется как стандартная спецификация формата.
  • Для типов chrono спецификация формата интерпретируется как спецификация формата chrono.
  • Для типов диапазонов спецификация формата интерпретируется как спецификация формата диапазона.
  • Для std::pair и std::tuple спецификация формата интерпретируется как спецификация формата кортежа.
  • Для std::thread::id и std::stacktrace_entry см. спецификацию формата идентификатора потока и спецификацию формата записи трассировки стека.
  • Для std::basic_stacktrace спецификатор формата не допускается.
(начиная с C++23)
  • Для std::filesystem::path см. спецификацию формата пути.
(начиная с C++26)
  • Для других форматируемых типов спецификация формата определяется пользовательскими специализациями formatter.
args - аргументы для форматирования

Исключения

  • std::bad_alloc при ошибке выделения памяти.
  • Передаёт любое исключение, выброшенное любым форматтером, например std::format_error, независимо от значения os.exceptions() и не устанавливая ios_base::badbit в состоянии ошибки os.
  • Может выбросить ios_base::failure, вызванное os.setstate(ios_base::badbit), которое вызывается, если вставка в os завершается неудачей.

Примечания

Если для вызова собственного API Unicode требуется транскодирование, недопустимые единицы кода заменяются на U+FFFD REPLACEMENT CHARACTER (см. «Стандарт Unicode — основная спецификация», главу 3.9).

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_print 202207L (C++23) Форматированный вывод
__cpp_lib_format 202207L (C++23) Предоставление std::basic_format_string

Пример

Отчёты об исправлениях

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

DR Применение к Опубликованное поведение Правильное поведение
LWG 4044 C++23 собственный API Unicode всегда использовался, если
терминал, на который ссылается os, может отображать Unicode
используется только в том случае, если терминал может отображать Unicode
только с помощью собственного API Unicode

См. также

vprint_nonunicode(std::ostream)
(C++23)
выводит символьные данные, используя стираемое по типу представление аргументов
(функция)
print(std::ostream)
(C++23)
выводит форматированное представление аргументов
(шаблон функции)
operator<<(std::basic_ostream)
вставляет символьные данные или выполняет вставку в поток-значение rvalue
(шаблон функции)
vprint_unicodevprint_unicode_buffered
(C++23)
выводит данные в поддерживающий Unicode stdout или файловый поток, используя стираемое по типу представление аргументов
(функция)
format
(C++20)
сохраняет форматированное представление аргументов в новой строке
(шаблон функции)

Внешние ссылки

1. Unicode — Википедия
2. Стандарт Unicode, версия 14.0 — основная спецификация

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

Spec-Zone.ru

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