Namespaces
Variants

Formatting library (since C++20)

From cppreference.net

文本格式化库为 printf 系列函数提供了一个安全且可扩展的替代方案,旨在对现有 C++ I/O 流库进行功能补充。

目录

格式规范

格式规范指定了如何通过不同类型的选项对对象进行格式化。

基础类型和标准字符串类型对象的格式化使用 基本格式规范 。其他库组件也可能提供各自的格式规范,详见 此处 说明。

格式化函数

定义于头文件 <format>
(C++20)
将参数的格式化表示存储到新字符串中
(函数模板)
(C++20)
通过输出迭代器写出其参数的格式化表示
(函数模板)
通过输出迭代器写出其参数的格式化表示,不超过指定大小
(函数模板)
确定存储其参数格式化表示所需的字符数
(函数模板)

格式字符串

定义于头文件 <format>
在构造时执行编译期格式字符串检查的类模板
(类模板)
创建可直接用于面向用户的格式化函数的运行时格式字符串
(函数)

格式化概念

定义于头文件 <format>
指定类型是可格式化的,即它特化了 std::formatter 并提供成员函数 parse format
(概念)

可扩展性支持与实现细节

定义于头文件 <format>
(C++20)
使用类型擦除参数表示的 std::format 非模板变体
(函数)
(C++20)
使用类型擦除参数表示的 std::format_to 非模板变体
(函数模板)
创建引用所有格式化参数的类型擦除对象,可转换为 format_args
(函数模板)
(C++20) (C++26 中弃用)
用户定义格式化器的参数访问接口
(函数模板)
(C++20)
为给定类型定义格式化规则
(类模板)
辅助实现范围类型 std::formatter 特化的类模板
(类模板)
指示参数类型可被高效打印
(变量模板)
指定范围的格式化方式
(枚举)
为范围选择合适的 std::range_format
(变量模板)
为用户定义格式化器提供格式化参数访问的类模板
(类模板)
提供所有格式化参数访问的类
(类模板)
格式化状态,包含所有格式化参数和输出迭代器
(类模板)
格式化字符串解析器状态
(类模板)
格式化错误时抛出的异常类型
(类)

辅助项 (始于 C++23)

template < class R, class CharT >

concept /*const-formattable-range*/ =
ranges:: input_range < const R > &&

std:: formattable < ranges:: range_reference_t < const R > , CharT > ;
(1) ( 仅用于说明* )
template < class R, class CharT >

using /*fmt-maybe-const*/ =

std:: conditional_t < /*const-formattable-range*/ < R, CharT > , const R, R > ;
(2) ( 仅用于说明* )

注释

功能测试 标准 功能特性
__cpp_lib_format 201907L (C++20) 文本格式化
202106L (C++23)
(DR20)
编译期格式字符串检查;
减少 std::vformat_to 的参数化
202110L (C++23)
(DR20)
修复时间格式化器中的区域设置处理;
支持非常量可格式化类型
202207L (C++23)
(DR20)
暴露 std::basic_format_string
阐明时间类型本地化格式化中的编码处理
202304L (C++26) 指针格式化
202305L (C++26) 格式化参数类型检查
202306L (C++26) 成员函数 std::basic_format_arg::visit
202311L (C++26) 运行时格式字符串
202403L (C++26) 使用 std::println 打印空行
202403L (C++26)
(DR23)
允许 std::print 的高效实现
__cpp_lib_format_ranges 202207L (C++23) 范围格式化
__cpp_lib_format_path 202403L (C++26) std::filesystem::path 的格式化
__cpp_lib_format_uchar 202311L (C++26) 修复代码单元作为整数的格式化
__cpp_lib_formatters 202302L (C++23) 格式化 std::thread::id std::stacktrace

我们特意将 std::basic_format_string P2508 )的添加视为缺陷报告处理,因为所有已知实现都在C++20模式下提供了这些组件,尽管官方并未将其归类为此类情况。

示例

#include <cassert>
#include <format>
int main()
{
    std::string message = std::format("The answer is {}.", 42);
    assert(message == "The answer is 42.");
}

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时的行为 正确行为
P2418R2 C++20 既非常量可格式化亦不可复制的对象
(如生成器类对象)不可格式化
允许格式化这些对象
(放宽格式化器要求)
P2508R1 C++20 该功能没有对用户可见的名称 暴露 basic_format_string 名称

参见

(C++23)
使用参数的 格式化 表示打印到 stdout 或文件流
(函数模板)
(C++23)
std::print 相同,但每次打印后会附加换行符
(函数模板)
输出参数的 格式化 表示
(函数模板)