名前空間
変種
操作

std::print

From 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::make_format_args で必要とされるように、Args のいずれかの Ti に対して std::formatter<Ti, char>BasicFormatter 要件を満たさない場合、動作は未定義となる。

目次

[編集] パラメータ

stream - 書き込む出力ファイルストリーム
fmt - フォーマット文字列を表すオブジェクト。フォーマット文字列は以下で構成される:
  • 通常の文字({} を除く)は、変更されずに出力にコピーされる。
  • エスケープシーケンス {{}} は、それぞれ出力で {} に置き換えられる。
  • 置換フィールド。

各置換フィールドは以下の形式を持つ。

{ arg-id (オプション) } (1)
{ arg-id (オプション) : format-spec } (2)
1) フォーマット指定なしの置換フィールド
2) フォーマット指定ありの置換フィールド
arg-id - フォーマットに使用する args 内の引数のインデックスを指定する。省略された場合、引数は順番に使用される。

フォーマット文字列内の arg-id は、すべて存在するか、すべて省略されなければならない。手動と自動のインデックス付けを混在させることはエラーである。

format-spec - 対応する引数に対する std::formatter 特殊化によって定義されるフォーマット指定。} で開始することはできない。

(C++23から)
(C++26以降)
  • その他のフォーマット可能な型の場合、フォーマット指定はユーザー定義の formatter 特殊化によって決定される。
args... - フォーマットする引数

[編集] 例外

[編集] 注釈

機能テストマクロ 規格 機能
__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");  // 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++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
P3107R5 C++23 バッファリングされた出力操作のみが可能 バッファなし出力操作を実行できる
P3235R3 C++23 追加された関数の名前
P3107R5 によって誤解を招くものだった
関数名を変更した

[編集] 関連項目

(C++23)
std::printと同じだが、各出力の末尾に改行が追加される点が異なる
(関数テンプレート) [編集]
引数の書式化された表現を出力する
(関数テンプレート) [編集]
(C++20)
引数のフォーマット済み表現を新しい文字列に格納する
(関数テンプレート) [編集]
(C++20)
引数のフォーマット済み表現を出力イテレータを介して書き出す
(関数テンプレート) [編集]
stdout、ファイルストリーム、またはバッファにフォーマットされた出力を書き込む
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)