std::format 是 C++20 引入的类型安全、高性能、无副作用格式化库,基于 Python 语法但编译期检查、零运行时解析开销;支持位置参数、格式说明符(如 {:x}、{:.2f})和花括号转义,C++23 起扩展命名参数。
std::format 是 C++20 引入的类型安全、高性能、无副作用的格式化库,替代了传统的 printf 和易出错的 std::ostringstream 拼接。它基于 Python 的 str.format() 语法,但完全编译期检查、零运行时解析开销(多数情况下),且不依赖 C 运行时。
最常用的是 std::format 函数,返回 std::string:
{},自动按参数顺序填充int、double、std::string、const char* 等内置/标准类型默认支持)例子:
std::string s = std::format("Hello {}, you have {} messages", "Alice", 42);在 {} 中加冒号 : 后写格式说明符,类似 Python:
{:d} 十进制整数(显式){:x} 小写十六进制,{:X} 大写{:.2f} 保留两位小数的浮点数{:>10} 右对齐、最小宽度 10{:^8s} 居中、宽 8、字符
串截断或补空格{:05d} 补零至 5 位(如 42 → "00042")例子:
auto s = std::format("0x{:04x}, {:.3f}, {:>6}", 255, 3.14159, "hi");标准 C++20 **只支持位置参数(隐式 0,1,2… 或显式 {0},{1})**,不支持命名如 {name} —— 这是 C++23 的 std::format 新特性。不过你可以安全使用:
{0}、{1} 显式指定位置(避免歧义,尤其含 { 字符时)std::format("{0} * {0} = {1}", x, x*x)
{{ 或 }} 表示字面量 { 或 }
例子:
std::format("Price: ${0:.2f} (was ${1:.2f})", sale, original);C++20 标准 **没有 std::print** —— 那是 C++23 加入的。目前(C++20)推荐写法是:
std::cout 注意:不要用 std::format_to + std::back_inserter 做简单输出,它适合写入预分配 buffer 场景(如日志缓冲区)。
基本上就这些。std::format 安全、简洁、可读性强,取代 sprintf 和手工拼接完全可行。只要编译器支持(GCC 13+、Clang 15+、MSVC 19.32+),打开 -std=c++20 就能用。不复杂但容易忽略细节——比如忘记它不支持命名参数(C++20),或误以为有 std::print。