C++
编译器支持
独立和宿主
语言
标准库
标准库头文件
具名要求
特性测试宏 (C++20)
语言支持库
概念库 (C++20)
诊断库
内存管理库
元编程库 (C++11)
通用工具库
容器库
迭代器库
范围库 (C++20)
算法库
字符串库
文本处理库
数值库
日期和时间库
输入/输出库
文件系统库 (C++17)
并发支持库 (C++11)
执行控制库 (C++26)
技术规范
符号索引
外部库
[编辑] 文本处理库
本地化库
正则表达式库 (C++11)
格式化库 (C++20)
空终止序列工具
字节字符串
多字节字符串
宽字符串
原始数值转换
to_chars(C++17)
to_chars_result(C++17)
from_chars(C++17)
from_chars_result(C++17)
chars_format(C++17)
文本编码标识
text_encoding(C++26)
[编辑] 格式化库
标准格式规范
格式化函数
format(C++20)
format_to(C++20)
format_to_n(C++20)
formatted_size(C++20)
vformat(C++20)
vformat_to(C++20)
格式化字符串
basic_format_stringformat_stringwformat_string(C++20)(C++20)(C++20)
runtime_format(C++26)
格式化概念
formattable(C++23)
Formatter
formatter(C++20)
formatter
formatter
range_formatter(C++23)
enable_nonlocking_formatter_optimization(C++23)
basic_format_parse_contextformat_parse_contextwformat_parse_context(C++20)(C++20)(C++20)
basic_format_contextformat_contextwformat_context(C++20)(C++20)(C++20)
range_format(C++23)
format_kind(C++23)
格式化参数
basic_format_arg(C++20)
basic_format_arg::handle(C++20)
basic_format_argsformat_argswformat_args(C++20)(C++20)(C++20)
visit_format_arg(C++20) (在 C++26 中已弃用)
make_format_argsmake_wformat_args(C++20)(C++20)
格式化错误
format_error(C++20)
[编辑]
定义于头文件
template< class... Args >
std::string format( std::format_string
(1)
(自 C++20 起)
template< class... Args >
std::wstring format( std::wformat_string
(2)
(自 C++20 起)
template< class... Args >
std::string format( const std::locale& loc,
std::format_string
(3)
(自 C++20 起)
template< class... Args >
std::wstring format( const std::locale& loc,
std::wformat_string
(4)
(自 C++20 起)
根据格式化字符串 fmt 格式化 args,并将结果作为字符串返回。如果存在 loc,则用于特定于区域设置的格式化。
1) 等价于 return std::vformat(fmt.get(), std::make_format_args(args...));。
2) 等价于 return std::vformat(fmt.get(), std::make_wformat_args(args...));。
3) 等价于 return std::vformat(loc, fmt.get(), std::make_format_args(args...));。
4) 等价于 return std::vformat(loc, fmt.get(), std::make_wformat_args(args...));。
自 P2216R3 起,std::format 对格式化字符串执行编译时检查(通过辅助类型 std::format_string 或 std::wformat_string)。如果发现对于要格式化的参数类型无效,则会发出编译错误。如果格式化字符串不能是编译时常量,或者需要避免编译时检查,请使用 std::vformat 或在 fmt 上使用 std::runtime_format(自 C++26 起) 代替。
以下要求适用于 Args 中的每种类型 T,其中对于重载 (1,3),CharT 是 char;对于重载 (2,4),CharT 是 wchar_t
std::formatter
目录
1 参数
2 返回值
3 异常
4 注解
5 示例
6 缺陷报告
7 参见
[编辑] 参数
fmt
-
[编辑]表示格式化字符串的对象。格式化字符串由以下部分组成:普通字符(除了 { 和 }),它们在输出中保持不变,转义序列 {{ 和 }},它们在输出中分别被替换为 { 和 },以及替换字段。
每个替换字段具有以下格式
{ arg-id (可选) }
(1)
{ arg-id (可选) : format-spec }
(2)
1) 没有格式规范的替换字段
2) 带有格式规范的替换字段
arg-id
-
指定 args 中参数的索引,其值将用于格式化;如果省略,则按顺序使用参数。格式化字符串中的 arg-id 必须全部存在或全部省略。混合手动和自动索引是一个错误。
format-spec
-
由相应参数的 std::formatter 特化定义的格式规范。不能以 } 开头。
对于基本类型和标准字符串类型,格式规范被解释为 标准格式规范。对于 chrono 类型,格式规范被解释为 chrono 格式规范。
对于范围类型,格式规范被解释为 范围格式规范。对于 std::pair 和 std::tuple,格式规范被解释为 元组格式规范。对于 std::thread::id 和 std::stacktrace_entry,请参阅 线程 ID 格式规范 和 堆栈跟踪条目格式规范。对于 std::basic_stacktrace,不允许使用格式说明符。
(自 C++23 起)
对于 std::filesystem::path,请参阅 路径格式规范。
(自 C++26 起)
对于其他可格式化类型,格式规范由用户定义的 formatter 特化确定。
args...
-
要格式化的参数
loc
-
std::locale 用于特定于区域设置的格式化
[编辑] 返回值
一个字符串对象,包含格式化后的结果。
[编辑] 异常
在内存分配失败时抛出 std::bad_alloc。 也会传播任何格式化程序抛出的异常。
[编辑] 注解
提供比格式化字符串要求的参数更多的参数不是错误
std::format("{} {}!", "Hello", "world", "something"); // OK, produces "Hello world!"
从 P2216R3 开始,如果格式化字符串不是常量表达式,则会报错。 在这种情况下可以使用 std::vformat。
std::string f(std::string_view runtime_format_string)
{
// return std::format(runtime_format_string, "foo", "bar"); // error
return std::vformat(runtime_format_string, std::make_format_args("foo", "bar")); // OK
}
std::runtime_format 可以直接在 std::format 上使用,而不是 std::vformat,后者需要 std::basic_format_args 作为参数。
std::string f(std::string_view runtime_format_string)
{
return std::format(std::runtime_format(runtime_format_string), "foo", "bar");
}
(自 C++26 起)
[编辑] 示例
运行此代码
#include
#include
#include
#include
template
std::string dyna_print(std::string_view rt_fmt_str, Args&&... args)
{
return std::vformat(rt_fmt_str, std::make_format_args(args...));
}
int main()
{
std::cout << std::format("Hello {}!\n", "world");
std::string fmt;
for (int i{}; i != 3; ++i)
{
fmt += "{} "; // constructs the formatting string
std::cout << fmt << " : ";
std::cout << dyna_print(fmt, "alpha", 'Z', 3.14, "unused");
std::cout << '\n';
}
}
输出
Hello world!
{} : alpha
{} {} : alpha Z
{} {} {} : alpha Z 3.14
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR
应用于
已发布行为
正确行为
P2216R3
C++20
对于无效的格式化字符串,抛出 std::format_error
无效的格式化字符串导致编译时错误
P2418R2
C++20
既不是 const 可用也不是可复制的对象(例如类似生成器的对象)不可格式化
允许格式化这些对象
P2508R1
C++20
此工具没有用户可见的名称
名称 basic_format_string 被公开
[编辑] 参见
format_to(C++20)
通过输出迭代器写出其参数的格式化表示 (函数模板) [编辑]
format_to_n(C++20)
通过输出迭代器写出其参数的格式化表示,不超过指定大小 (函数模板) [编辑]