命名空间
变体
操作

std::format

来自 cppreference.cn
< cpp‎ | utility‎ | format
 
 
 
 
定义于头文件 <format>
template< class... Args >
std::string format( std::format_string<Args...> fmt, Args&&... args );
(1) (C++20 起)
template< class... Args >
std::wstring format( std::wformat_string<Args...> fmt, Args&&... args );
(2) (C++20 起)
template< class... Args >

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

                    std::format_string<Args...> fmt, Args&&... args );
(3) (C++20 起)
template< class... Args >

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

                     std::wformat_string<Args...> 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_stringstd::wformat_string)。如果发现它对要格式化的参数类型无效,则会发出编译错误。如果格式字符串不能是编译时常量,或者需要避免编译时检查,则改用 std::vformat std::runtime_formatfmt(C++26 起)

以下要求适用于 Args 中的每种类型 T,其中 (1,3) 重载的 CharTchar(2,4) 重载的 CharTwchar_t

目录

[编辑] 参数

fmt - 表示格式化字符串的对象。格式化字符串由以下部分组成:
  • 普通字符(除了 {}),它们被原样复制到输出,
  • 转义序列 {{}},它们分别在输出中替换为 {},以及
  • 替换字段。

每个替换字段具有以下格式:

{ arg-id (可选) } (1)
{ arg-id (可选) : format-spec } (2)
1) 没有格式化规范的替换字段
2) 带有格式化规范的替换字段
arg-id - 指定 args 中用于格式化的参数的索引;如果省略,则按顺序使用参数。

格式化字符串中的 arg-id 必须全部存在或全部省略。混合手动和自动索引是错误的。

format-spec - 由相应参数的 std::formatter 特化定义的格式规范。不能以 } 开头。

(C++23 起)
(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 <format>
#include <iostream>
#include <string>
#include <string_view>
 
template<typename... Args>
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++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
P2216R3 C++20 对无效格式字符串抛出 std::format_error 无效格式字符串导致编译时错误
P2418R2 C++20 既不可 const 使用也不可复制的对象
(例如生成器类对象) 不可格式化
允许格式化这些对象
P2508R1 C++20 该功能没有用户可见的名称 公开了名称 basic_format_string

[编辑] 另请参阅

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