
std::print 是更简洁安全的格式化输出方式,但 iostream 仍是通用主力,两者定位不同,不互斥。
std::print 的核心优势:类型安全 + 零成本格式化
它基于 std::format,编译期检查格式字符串与参数类型是否匹配,避免 printf 类型错配导致的未定义行为。比如:
std::print("Hello, {}! Age: {}\n", "Alice", 28); // ✅ 编译通过
std::print("Hello, {}! Age: {}\n", "Alice", "28"); // ❌ 编译失败(类型不匹配)
它不依赖 C 运行时,不涉及 va_list,无缓冲区溢出风险,也不修改全局状态(如 locale 或格式标志),天生线程友好。
iostream 依然不可替代:流控制 + 扩展性 + 生态兼容
当你需要:
立即学习“C++免费学习笔记(深入)”;
- 重定向到文件、字符串流(
std::ostringstream)、网络缓冲区等任意std::basic_ostream对象 - 精细控制格式(如
std::setw、std::hex、自定义operator) - 与现有代码(尤其模板库、日志系统、GUI 框架)无缝集成
这时候 std::cout 仍是首选。它不是“旧”,而是“可组合”——你能把它封装进日志宏、管道操作符,甚至配合 std::ranges::views 做流式处理。
实际怎么选?看场景,不看版本新旧
- 快速调试打印、命令行工具输出 → 用
std::print,少写、少错、易读 - 构建日志系统、序列化、协议编码、需要复用已有流逻辑 → 继续用
iostream - 想统一格式风格又兼顾性能?可封装
std::print到自定义流类(C++23 允许为std::print提供自定义std::formatter)
注意:std::print 当前仍有局限
截至 C++23 标准,std::print 只支持输出到 stdout 和 std::FILE*(如 stderr),不支持输出到 std::ostream 对象(比如 std::cout 或 std::ostringstream)。这意味着你不能直接用它替代 std::ostringstream 构造格式化字符串——得用 std::format 单独生成,再写入流。
另外,部分标准库实现(如早期 libstdc++ 或 MSVC 19.35 前)尚未完全支持,使用前建议确认编译器和 STL 版本。
基本上就这些。新特性不是用来取代旧工具的,而是补上长期缺失的一环:安全、现代、不妥协的“简单打印”。该用 print 时别硬套 ,该用流时也无需强切 print——C++23 让你多一个靠谱选项,而不是必须换掉老朋友。











