[formatter.requirements] # 28 Text processing library [[text]](./#text) ## 28.5 Formatting [[format]](format#formatter.requirements) ### 28.5.6 Formatter [[format.formatter]](format.formatter#formatter.requirements) #### 28.5.6.1 Formatter requirements [formatter.requirements] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L6981) A type F meets the *BasicFormatter* requirements if it meets the - [(1.1)](#1.1) *Cpp17DefaultConstructible* (Table [30](utility.arg.requirements#tab:cpp17.defaultconstructible "Table 30: Cpp17DefaultConstructible requirements")), - [(1.2)](#1.2) *Cpp17CopyConstructible* (Table [32](utility.arg.requirements#tab:cpp17.copyconstructible "Table 32: Cpp17CopyConstructible requirements (in addition to Cpp17MoveConstructible)")), - [(1.3)](#1.3) *Cpp17CopyAssignable* (Table [34](utility.arg.requirements#tab:cpp17.copyassignable "Table 34: Cpp17CopyAssignable requirements (in addition to Cpp17MoveAssignable)")), - [(1.4)](#1.4) *Cpp17Swappable* ([[swappable.requirements]](swappable.requirements "16.4.4.3 Swappable requirements")), and - [(1.5)](#1.5) *Cpp17Destructible* (Table [35](utility.arg.requirements#tab:cpp17.destructible "Table 35: Cpp17Destructible requirements")) requirements, and the expressions shown in Table [112](#tab:formatter.basic "Table 112: BasicFormatter requirements") are valid and have the indicated semantics[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L6995) A type F meets the *Formatter* requirements if it meets the *BasicFormatter* requirements and the expressions shown in Table [113](#tab:formatter "Table 113: Formatter requirements") are valid and have the indicated semantics[.](#2.sentence-1) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7001) Given character type charT, output iterator typeOut, and formatting argument type T, in Table [112](#tab:formatter.basic "Table 112: BasicFormatter requirements") and Table [113](#tab:formatter "Table 113: Formatter requirements"): - [(3.1)](#3.1) f is a value of type (possibly const) F, - [(3.2)](#3.2) g is an lvalue of type F, - [(3.3)](#3.3) u is an lvalue of type T, - [(3.4)](#3.4) t is a value of a type convertible to (possibly const) T, - [(3.5)](#3.5) PC is basic_format_parse_context, - [(3.6)](#3.6) FC is basic_format_context, - [(3.7)](#3.7) pc is an lvalue of type PC, and - [(3.8)](#3.8) fc is an lvalue of type FC[.](#3.sentence-1) pc.begin() points to the beginning of the*format-spec* ([[format.string]](format.string "28.5.2 Format string")) of the replacement field being formatted in the format string[.](#3.sentence-2) If *format-spec* is not present or empty then eitherpc.begin() == pc.end() or*pc.begin() == '}'[.](#3.sentence-3) Table [112](#tab:formatter.basic) — *BasicFormatter* requirements [[tab:formatter.basic]](./tab:formatter.basic) | [🔗](#tab:formatter.basic-row-1)
**Expression** | **Return type** | **Requirement** | | --- | --- | --- | | [🔗](#tab:formatter.basic-row-2)
g.parse(pc) | PC​::​iterator | Parses *format-spec* ([[format.string]](format.string "28.5.2 Format string")) for type T in the range [pc.begin(), pc.end()) until the first unmatched character[.](#tab:formatter.basic-row-2-column-3-sentence-1)
Throws format_error unless the whole range is parsed or the unmatched character is }[.](#tab:formatter.basic-row-2-column-3-sentence-2)
[*Note [1](#tab:formatter.basic-row-2-column-3-note-1)*:
This allows formatters to emit meaningful error messages[.](#tab:formatter.basic-row-2-column-3-sentence-3) — *end note*]
Stores the parsed format specifiers in *this and returns an iterator past the end of the parsed range[.](#tab:formatter.basic-row-2-column-3-sentence-4) | | [🔗](#tab:formatter.basic-row-3)
f.format(u, fc) | FC​::​iterator | Formats u according to the specifiers stored in *this, writes the output to fc.out(), and returns an iterator past the end of the output range[.](#tab:formatter.basic-row-3-column-3-sentence-1)
The output shall only depend on u, fc.locale(), fc.arg(n) for any value n of type size_t, and the range [pc.begin(), pc.end()) from the last call to f.parse(pc)[.](#tab:formatter.basic-row-3-column-3-sentence-2) | Table [113](#tab:formatter) — *Formatter* requirements [[tab:formatter]](./tab:formatter) | [🔗](#tab:formatter-row-1)
**Expression** | **Return type** | **Requirement** | | --- | --- | --- | | [🔗](#tab:formatter-row-2)
f.format(t, fc) | FC​::​iterator | Formats t according to the specifiers stored in *this, writes the output to fc.out(), and returns an iterator past the end of the output range[.](#tab:formatter-row-2-column-3-sentence-1)
The output shall only depend on t, fc.locale(), fc.arg(n) for any value n of type size_t, and the range [pc.begin(), pc.end()) from the last call to f.parse(pc)[.](#tab:formatter-row-2-column-3-sentence-2) | | [🔗](#tab:formatter-row-3)
f.format(u, fc) | FC​::​iterator | As above, but does not modify u[.](#tab:formatter-row-3-column-3-sentence-1) |