命名空间
变体
操作

C++ 命名要求: 格式化程序 (自 C++20 起)

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

格式化程序 是一个类型,它为给定的格式化参数类型和字符类型抽象了格式化操作。标准库提供的 std::formatter 的特化需要满足 格式化程序 的要求,除非另有说明。

一个 格式化程序 能够格式化常量和非常量参数,通常通过提供一个接受常量引用的 format 成员函数。

[编辑] 要求

如果一个类型满足 基本格式化程序,并且在给定以下类型和值的情况下,下表中所示的表达式有效,并且具有指示的语义,那么该类型满足 格式化程序

类型 定义
CharT 一个字符类型
Arg 一个格式化参数类型
格式化程序 一个用于类型 ArgCharT格式化程序 类型
OutputIt 一个 传统输出迭代器 类型
ParseCtx std::basic_format_parse_context<CharT>
FmtCtx std::basic_format_context<OutputIt, CharT>
定义
f 一个类型为(可能被限定为常量)Formatter 的值
arg 一个类型为 Arg 的左值
t 一个可以转换为(可能被限定为常量)Arg 类型的值
parse_ctx 一个类型为 ParseCtx 且满足以下所有条件的左值
  • parse_ctx.begin() 指向正在格式化替换字段的 格式说明符 的开头,该字段位于 格式字符串 中。
  • 如果 格式说明符 不存在或为空,则 parse_ctx.begin() == parse_ctx.end()*parse_ctx.begin() == '}'
fmt_ctx 一个类型为 FmtCtx 的左值
表达式 返回类型 语义
f.format(t, fmt_ctx) FmtCtx::iterator 
  • 根据存储在 f 中的说明符格式化 t,将输出写入 fmt_ctx.out() 并且返回输出范围的结束迭代器。
  • 输出只能依赖于
    • t,
    • fmt_ctx.locale(),
    • 上一次调用 f.parse(parse_ctx) 时,来自范围 [parse_ctx.begin()parse_ctx.end()),以及
    • fmt_ctx.arg(n),对于 std::size_t 类型的任何值 n
f.format(arg, fmt_ctx) FmtCtx::iterator 与上面相同,但不会修改 arg

[编辑] 缺陷报告

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

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