std::print 不存在于 c++23 正式标准中,仅作为提案 p2093 的未实现部分出现在附录 d;当前所有主流编译器均未提供其实现,可用替代方案是 std::format 配合 std::cout。

std::print 不存在于当前任何正式发布的 C++ 标准中——C++23 没有 std::print。 它是提案 P2093(Text Formatting)的一部分,曾被纳入 C++23 的“功能特性时间表”,但最终未进入 C++23 正式标准。截至 GCC 14、Clang 18、MSVC 19.39,所有主流编译器均未实现 std::print。你看到的教程或博客内容,基本来自早期草案、实验性分支(如 libc++ 的 __format 内部接口)或误传。
为什么找不到 std::print?——C++23 实际落地情况
C++23 确实引入了 std::format(基于 Python-style 的格式化语法),并配套提供 std::println(带换行)和 std::print(不带换行)的声明,但它们被标记为“feature-test macro 未启用”且无标准库实现支持。即使你写了:
std::print("Hello, {}!", "world");
也会在编译时报错:error: 'print' is not a member of 'std' 或链接失败(符号未定义)。
关键事实:
立即学习“C++免费学习笔记(深入)”;
- C++23 标准文档(ISO/IEC 14882:2023)中
std::print仅存在于“待完成”附录(Annex D),不是强制实现项 - libc++、libstdc++、MSVC STL 当前(2024 年中)均未提供
std::print的定义 -
__cpp_lib_format宏可能已定义(表示std::format可用),但__cpp_lib_print在所有编译器中仍为未定义
现在能用的 C++23 替代方案:std::format + std::cout
真正可用、跨编译器支持(GCC 13+/Clang 15+/MSVC 19.34+)、符合 C++23 的做法是组合使用 std::format 和 std::cout:
std::cout << std::format("Value: {:.2f}, count: {}", 3.14159, 42) << '\n';
这是目前最接近“高效替代 std::cout 流式输出”的安全路径。注意几点:
-
std::format返回std::string(或std::wstring),不是零拷贝;对性能敏感场景(如高频日志),需权衡临时字符串构造开销 - 格式说明符与 Python 一致:
{}、{:.3f}、{:08x}、{: 都有效 - 支持自定义类型,只要特化了
std::formatter<t></t>(需继承std::formatter<:string></:string>等基类并实现parse()和format()) - 不支持运行时格式串(
std::format(fmt_str, ...)中fmt_str必须是字面量或consteval表达式),否则编译失败——这是为编译期安全做的限制
别踩坑:std::print 常见误用与混淆点
很多开发者把以下几种东西当成 std::print 使用,结果出错:
-
把
std::println当成已实现函数:它和std::print同属未实现提案,同样不可用 -
误用 fmtlib({fmt} 库)的
fmt::print:这是第三方库(fmtlib),头文件是<fmt></fmt>或<fmt></fmt>,和std::无关;它稳定、高效、广泛使用,但不是标准 C++ -
混用
std::format_to和输出流:例如std::format_to(std::ostream_iterator<char>(std::cout), "...")</char>—— 这可行但冗长,且不如直接直观 -
忽略 locale 影响:
std::format默认使用 C locale,若需本地化数字分隔符(如千位逗号),必须显式传入std::locale{}参数,否则格式无效
真正想用类似 print 的简洁输出,现阶段最务实的选择仍是 {fmt} 库(fmt::print("{}", x)),或坚持用 std::cout 组合。等 libc++ 或 libstdc++ 某个版本正式开启 <code>std::print 实现并稳定后,再切过去——目前它还只是纸面上的标准名。










