std::print
来自cppreference.com
在标头 <print> 定义 | ||
template<class... Args> void print(std::format_string<Args...> fmt, Args&&... args); | (1) | (C++23 起) |
template<class... Args> void print(std::FILE* stream, | (2) | (C++23 起) |
根据格式字符串 fmt 格式化 args,并将结果打印到流中。
1) 等价于 std::print(stdout, fmt, std::forward<Args>(args)...)。
2)通常字面量编码是 UTF-8 时等价于 (std::enable_nonlocking_formatter_optimization<std::remove_cvref_t<Args>>&& ...)
?std::vprint_unicode(stream, fmt.str, std::make_format_args(args...))
: std::vprint_unicode_buffered(stream, fmt.str, std::make_format_args(args...));。
?std::vprint_unicode(stream, fmt.str, std::make_format_args(args...))
: std::vprint_unicode_buffered(stream, fmt.str, std::make_format_args(args...));。
否则等价于 (std::enable_nonlocking_formatter_optimization<std::remove_cvref_t<Args>>&& ...)
?std::vprint_nonunicode(stream, fmt.str, std::make_format_args(args...))
: std::vprint_nonunicode_buffered(stream, fmt.str, std::make_format_args(args...));。
?std::vprint_nonunicode(stream, fmt.str, std::make_format_args(args...))
: std::vprint_nonunicode_buffered(stream, fmt.str, std::make_format_args(args...));。
如果 Args
中存在任何 Ti
导致 std::formatter<Ti, char> 不满足基本格式化器(BasicFormatter) (如 std::make_format_args 所要求),那么行为未定义。
目录 |
[编辑]参数
stream | - | 要写入的输出文件流 | ||||||||||||||||||||||||||||||||||||||||||||||
fmt | - | 用于表示格式字符串的对象。格式字符串由以下组成
每个替换域拥有如下格式:
1) 没有格式说明的替换域 2) 有格式说明的替换域
| ||||||||||||||||||||||||||||||||||||||||||||||
args... | - | 要格式化的实参 |
[编辑]异常
- 内存分配失败时抛出 std::bad_alloc。
- 当向流写入失败时抛出 std::system_error。
- 传播由其所使用的格式化器所抛出的任何异常,比如 std::format_error。
[编辑]注解
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__cpp_lib_print | 202207L | (C++23) | 格式化输出 |
202403L | (C++26) (DR23) | 无缓冲的格式化输出 | |
202406L | (C++26) (DR23) | 为更多可格式化类型启用无缓冲的格式化输出 | |
__cpp_lib_format | 202207L | (C++23) | 暴露 std::basic_format_string |
[编辑]示例
运行此代码
#include <cstdio>#include <filesystem>#include <print> int main(){ std::print("{2} {1}{0}!\n", 23, "C++", "Hello");// 重载 (1) constauto tmp{std::filesystem::temp_directory_path()/"test.txt"};if(std::FILE* stream {std::fopen(tmp.c_str(), "w")}){ std::print(stream, "File: {}", tmp.string());// 重载 (2)std::fclose(stream);}}
输出:
Hello C++23!
[编辑]缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
P3107R5 | C++23 | 只能进行有缓冲的打印操作 | 可以进行无缓冲的打印操作 |
P3235R3 | C++23 | P3107R5新增的函数的名字会导致误解 | 更换函数名 |
[编辑]参阅
(C++23) | 将参数的格式化表达输出到 stdout 或文件缓冲区,输出完成后换行 (函数模板) |
(C++23) | 输出各实参的格式化表示 (函数模板) |
(C++20) | 在新字符串中存储参数的格式化表示 (函数模板) |
(C++20) | 通过输出迭代器写入其实参的格式化表示 (函数模板) |
(C++11) | 打印有格式输出到 stdout、文件流或缓冲区 (函数) |