名前空間
変種
操作

C++ の名前付き要件: BasicFormatter (C++20 以降)

From cppreference.com
 
 
C++ 名前付き要件
 

BasicFormatter は、指定された書式設定引数型と文字型に対する書式設定操作を抽象化する型です。std::formatter の特殊化は、BasicFormatter の要件を満たす必要があります。

BasicFormatter は、const 引数と非 const 引数の両方を書式設定できる場合、Formatter です。

[編集] 要件

ある型が BasicFormatter を満たすのは、それがセミレギュラーである場合です。つまり、以下の要件を満たします。

そして、以下の型と値が与えられた場合、以下の表に示す式は有効であり、示された意味を持ちます。

定義
CharT 文字型
Arg 書式設定引数型
フォーマッタ ArgCharT のための 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() は、書式文字列で書式設定される置換フィールドの format-spec の先頭を指します。
  • format-spec が存在しないか空の場合、parse_ctx.begin() == parse_ctx.end() であるか、*parse_ctx.begin() == '}' のいずれかです。
fmt_ctx FmtCtx の左辺値
Expression 戻り値の型 セマンティクス
g.parse(parse_ctx) ParseCtx::iterator 
  • 範囲 [parse_ctx.begin()parse_ctx.end()) で、型 Argformat-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++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3892 C++20 format-spec が存在しない場合、pc.begin() の値が不明確でした。 明確化された
English 日本語 中文(简体) 中文(繁體)