- system_error[meta header]
- std[meta namespace]
- class[meta id-type]
- cpp29[meta cpp]
namespace std {
template <class charT>
struct formatter<error_code, charT>;
}error_codeクラスに対するstd::formatterクラステンプレートの特殊化。
フォーマットフラグとしては、以下を使用できる:
[[fill] [align] [width]] [?] [s]
- デフォルトでは、ストリーム出力と同じ「カテゴリ名
:エラー値」の形式(例:generic:2)で出力される sを指定すると、message()で得られるエラーメッセージが出力されるcharTがcharであり、通常の文字列リテラルのエンコーディングがUTF-8である場合、メッセージはUTF-8へ変換され、不正なバイト列はU+FFFD(置換文字)に置き換えられる
?を指定すると、デバッグ出力としてエラーコード全体が引用符で囲まれたエスケープ文字列として出力される- カテゴリ名とエラー値を区切る
:が、連想コンテナのフォーマット出力におけるキーと値の区切りの:と紛らわしくなることを避けられる
- カテゴリ名とエラー値を区切る
- ストリーム出力の
operator<<では、std::setw()などの入出力マニピュレータがカテゴリ名だけに適用されてしまう問題があった。このformatter特殊化では、幅や整列の指定はエラーコード全体に適用される - エラー値のみを出力するためのフラグは提供されない。エラー値はカテゴリの情報がなければ有用性が低く、必要であれば
ec.value()を直接フォーマットすればよいためである
#include <format>
#include <iostream>
#include <system_error>
int main()
{
std::error_code ec = std::make_error_code(std::errc::no_such_file_or_directory);
std::cout << std::format("{}", ec) << std::endl;
std::cout << std::format("[{:>12}]", ec) << std::endl;
std::cout << std::format("{:?}", ec) << std::endl;
std::cout << std::format("{:s}", ec) << std::endl;
}- std::make_error_code[link /reference/system_error/make_error_code.md]
- std::errc[link /reference/system_error/errc.md]
generic:2
[ generic:2]
"generic:2"
No such file or directory
- C++29
- Clang: ??
- GCC: ??
- Visual C++: ??
std::format()(フォーマットの詳細)operator<<