Spec-Zone.ru › C++

Именованные требования C++: BasicFormatter (начиная с C++20)

BasicFormatter — это тип, который абстрагирует операции форматирования для заданного типа аргумента форматирования и типа символа. Специализации std::formatter должны соответствовать требованиям BasicFormatter.

BasicFormatter является Formatter, если он способен форматировать как константные, так и неконстантные аргументы.

Требования

Тип удовлетворяет требованиям BasicFormatter, если он является полурегулярным, то есть удовлетворяет требованиям:

  • DefaultConstructible
  • CopyConstructible
  • CopyAssignable
  • Destructible
  • Swappable

А для приведённых ниже типов и значений выражения из таблицы допустимы и обладают указанной семантикой:

Тип Определение
CharT тип символа
Arg тип аргумента форматирования
Formatter тип Formatter для типов Arg и CharT
OutputIt тип LegacyOutputIterator
ParseCtx std::basic_format_parse_context<CharT>
FmtCtx std::basic_format_context<OutputIt,CharT>
Значение Определение
f значение типа (возможно, с квалификатором const) Formatter
g значение типа Formatter
arg lvalue типа Arg
t значение типа, преобразуемого в Arg (возможно, с квалификатором const)
parse_ctx lvalue типа ParseCtx, удовлетворяющее всем следующим условиям:
  • parse_ctx.begin() указывает на начало format-spec форматируемого поля подстановки в строке формата.
  • Если format-spec отсутствует или пуст, то либо parse_ctx.begin() == parse_ctx.end(), либо *parse_ctx.begin() == '}'.
fmt_ctx lvalue типа FmtCtx
Выражение Возвращаемый тип Семантика
g.parse(parse_ctx) ParseCtx::iterator
  • В диапазоне [parse_ctx.begin(), parse_ctx.end()) разбирает format-spec для типа Arg до первого несопоставленного символа.
  • Выбрасывает std::format_error, если не разобран весь диапазон или несопоставленным символом не является }. [примечание 1]
  • Сохраняет разобранные спецификаторы формата в g и возвращает итератор конца разобранного диапазона.
f.format(arg, fmt_ctx) FmtCtx::iterator
  • Форматирует arg в соответствии со спецификаторами, сохранёнными в f, записывает результат в fmt_ctx.out() и возвращает итератор конца выходного диапазона.
  • Результат должен зависеть только от
    • arg,
    • fmt_ctx.locale(),
    • диапазона [parse_ctx.begin(), parse_ctx.end()) из последнего вызова f.parse(parse_ctx) и
    • fmt_ctx.arg(n) для любого значения n типа std::size_t.
  1. Это позволяет форматтерам выдавать содержательные сообщения об ошибках.

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

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

DR Применён к Опубликованное поведение Правильное поведение
LWG 3892 C++20 значение pc.begin() было неясным, если format-spec отсутствует прояснено

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

Spec-Zone.ru

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