命名空间
变体
操作

C++ 具名要求: Formatter (自 C++20 起)

来自 cppreference.cn
< cpp‎ | named req
 
 
C++ 具名要求
 

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

Formatter 能够格式化 const 和 non-const 参数,通常通过提供一个接受 const 引用的 format 成员函数来实现。

[编辑] 要求

如果一个类型满足 BasicFormatter,并且给定以下类型和值,则下表所示的表达式有效并具有指示的语义,则该类型满足 Formatter

类型 定义
CharT 一种字符类型
Arg 一种格式化参数类型
Formatter 类型 Arg 和 CharT 的 Formatter 类型
OutputIt 一种 LegacyOutputIterator 类型
ParseCtx std::basic_format_parse_context<CharT>
FmtCtx std::basic_format_context<OutputIt, CharT>
Value 定义
f 类型为(可能是 const 限定的)Formatter 的值
arg 类型为 Arg 的左值
t 类型可转换为(可能是 const 限定的)Arg 的值
parse_ctx 类型为 ParseCtx 的左值,满足以下所有条件
  • parse_ctx.begin() 指向正在格式化的替换字段的 format-spec格式字符串中的开头。
  • 如果 format-spec 不存在或为空,则 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 如果 format-spec 不存在,则 pc.begin() 的值不明确 已明确