命名空间
变体
操作

std::print

来自 cppreference.com
< cpp‎ | io
定义在头文件 <print>
template< class... Args >
void print( std::format_string<Args...> fmt, Args&&... args );
(1) (自 C++23 起)
template< class... Args >

void print( std::FILE* stream,

            std::format_string<Args...> fmt, Args&&... args );
(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::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::formatter<Ti, char> 必须满足 BasicFormatter 要求,对于 Args 中的任何 Ti(如 std::make_format_args 所需)。否则,行为未定义。

内容

[编辑] 参数

stream - 要写入的输出文件流
fmt - 表示格式字符串的对象。格式字符串由以下部分组成:
  • 普通字符(除了 {}),这些字符会原样复制到输出中,
  • 转义序列 {{}},它们在输出中分别替换为 {},以及
  • 替换字段。

每个替换字段都具有以下格式:

{ arg-id (可选) } (1)
{ arg-id (可选) : format-spec } (2)
1) 没有格式规范的替换字段
2) 有格式规范的替换字段
arg-id - 指定 args 中要用于格式化的参数的索引;如果省略,则按顺序使用参数。

格式字符串中的 arg-id s 必须全部存在或全部省略。混合手动和自动索引是错误的。

format-spec - std::formatter 特化对相应参数定义的格式规范。不能以 } 开头。

(自 C++23 起)
(自 C++26 起)
  • 对于其他可格式化类型,格式规范由用户定义的 formatter 特化确定。
args... - 要格式化的参数

[编辑] 异常

[编辑] 说明

功能测试 Std 功能
__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("{0} {2}{1}!\n", "Hello", 23, "C++");  // overload (1)
 
    const auto tmp {std::filesystem::temp_directory_path() / "test.txt"};
 
    if (std::FILE* stream{std::fopen(tmp.c_str(), "w")})
    {
        std::print(stream, "File: {}", tmp.string()); // overload (2)
        std::fclose(stream);
    }
}

输出

Hello C++23!

[编辑] 参见

(C++23)
std::print 相同,只是每个输出后会额外添加一个换行符。
(函数模板) [编辑]
输出 格式化 后的参数表示。
(函数模板) [编辑]
(C++20)
将参数的格式化表示存储在一个新的字符串中。
(函数模板) [编辑]
(C++20)
通过输出迭代器输出其参数的格式化表示。
(函数模板) [编辑]
将格式化后的输出打印到 stdout,文件流或缓冲区。
(函数) [编辑]