命名空间
变体
操作

C++ 命名要求: BasicFormatter (自 C++20 起)

来自 cppreference.com
 
 
C++ 命名要求
 

BasicFormatter 是一个类型,它为给定的格式化参数类型和字符类型抽象格式化操作。需要 std::formatter 的特化以满足 BasicFormatter 的要求。

如果 BasicFormatter 能够格式化 const 和非 const 参数,则它是 Formatter

[编辑] 要求

如果一个类型是半正则的,那么它就满足 BasicFormatter,这意味着它满足

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

类型 定义
CharT 一个字符类型
Arg 一个格式化参数类型
Formatter 类型 ArgCharTFormatter 类型
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格式规范,直到第一个不匹配的字符。
  • 抛出 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()),以及
    • fmt_ctx.arg(n) 对于类型 std::size_t 的任何值 n
  1. 这允许格式化程序发出有意义的错误消息。

[编辑] 缺陷报告

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

DR 应用于 已发布的行为 正确行为
LWG 3892 C++20 如果 格式规范 不存在,则 pc.begin() 的值不清楚 已澄清