std::format

std::format

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(C++23)

formatter(C++23)

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 fmt, Args&&... args );

(1)

(自 C++20 起)

template< class... Args >

std::wstring format( std::wformat_string fmt, Args&&... args );

(2)

(自 C++20 起)

template< class... Args >

std::string format( const std::locale& loc,

std::format_string fmt, Args&&... args );

(3)

(自 C++20 起)

template< class... Args >

std::wstring format( const std::locale& loc,

std::wformat_string fmt, Args&&... args );

(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 必须满足 BasicFormatter std::formatter::parse() 必须是 constexpr,因为 P2216R3 (std::vformat 没有此要求)

目录

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)

通过输出迭代器写出其参数的格式化表示,不超过指定大小 (函数模板) [编辑]

相关推荐

电脑换主板后如何重装系统(详细步骤教你轻松搞定)
365在线官网下载

电脑换主板后如何重装系统(详细步骤教你轻松搞定)

📅 07-05 👁️ 9742
洞庭秋月
正规det365登录网站

洞庭秋月

📅 07-25 👁️ 3623
塞尔达传说武器耐久度修改在哪 武器耐久度怎么修复
正规det365登录网站

塞尔达传说武器耐久度修改在哪 武器耐久度怎么修复

📅 07-24 👁️ 7855