std::print 是更简洁安全的格式化输出方式,但 iostream 仍是通用主力,两者定位不同,不互斥。
它基于 std::format,编译期检查格式字符串与参数类型是否匹配,避免 printf 类型错配导致的未定义行为。比如:
std::print("Hello, {}! Age: {}\n", "Alice", 28); // ✅ 编译通过
std::print("Hello, {}! Age: {}\n", "Alice", "28"); // ❌ 编译失败(类型不匹配)
它不依赖 C 运行时,不涉及 va_list,无缓冲区溢出风险,也不修改全局状态(如 locale 或格式标志),天生线程友好。
当你需要:
立即学习“C++免费学习笔记(深入)”;
std::ostringstream)、网络缓冲区等任意 std::basic_ostream 对象std::setw、std::hex、自定义 operator)
这时候 std::cout 仍是首选。它不是“旧”,而是“可组合”——你能把它封装进日志宏、管道操作符,甚至配合 std::ranges::views 做流式处理。
std::print,少写、少错、易读iostream
std::print 到自定义流类(C++23 允许为 std::print 提供自定义 std::formatter)截至 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 让你多一个靠谱选项,而不是必须换掉老朋友。