Namespaces
Variants

C++ named requirements: BasicFormatter (since C++20)

From cppreference.net
C++ named requirements

BasicFormatter 是一种类型,用于抽象化特定格式化参数类型和字符类型的格式化操作。 std::formatter 的特化必须满足 BasicFormatter 的要求。

BasicFormatter 能够同时格式化常量与非常量参数时,它即满足 Formatter 的要求。

要求

一个类型满足 BasicFormatter 的条件是它必须满足半正则要求,这意味着:

并且,给定以下类型和值,下表中所示的表达式是有效的,并具有指定的语义:

类型 定义
CharT 字符类型
Arg 格式化参数类型
Formatter 用于类型 Arg CharT Formatter 类型
OutputIt LegacyOutputIterator 类型
ParseCtx std:: basic_format_parse_context < CharT >
FmtCtx std:: basic_format_context < OutputIt, CharT >
定义
f 类型为(可能带有 const 限定) Formatter 的值
g 类型为 Formatter 的值
arg 类型为 Arg 的左值
t 可转换为(可能带有 const 限定) Arg 类型的值
parse_ctx 类型为 ParseCtx 的左值,满足以下所有条件:
  • parse_ctx. begin ( ) 指向 格式字符串 中正在格式化的替换字段的 格式说明 起始位置。
  • 如果 格式说明 不存在或为空,则 parse_ctx. begin ( ) == parse_ctx. end ( ) * parse_ctx. begin ( ) == '}'
fmt_ctx 类型为 FmtCtx 的左值
表达式 返回类型 语义
g. parse ( parse_ctx ) ParseCtx::iterator
  • 在范围 [ parse_ctx. begin ( ) , parse_ctx. end ( ) ) 内,解析 Arg 类型的 format-spec 直至遇到第一个未匹配字符。
  • 除非整个范围被解析完成或未匹配字符是 } ,否则抛出 std::format_error [注释 1]
  • 将解析后的格式说明符存储于 g 中,并返回已解析范围的结束迭代器。
f. format ( arg, fmt_ctx ) FmtCtx::iterator
  • 根据存储于 f 中的说明符格式化 arg ,将输出写入 fmt_ctx. out ( ) 并返回输出范围的结束迭代器。
  • 输出应仅取决于:
    • arg
    • fmt_ctx. locale ( )
    • 来自最近一次调用 f. parse ( parse_ctx ) 的范围 [ parse_ctx. begin ( ) , parse_ctx. end ( ) ) ,以及
    • 对于 std::size_t 类型的任意值 n ,对应的 fmt_ctx. arg ( n )
  1. 这使得格式化程序能够输出有意义的错误信息。

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 3892 C++20 格式说明符 不存在时, pc. begin ( ) 的值不明确 已明确说明