Namespaces
Variants

std:: print

From cppreference.net
< 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の場合、 ordinary literal encoding は以下と等価: ( 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... ) ) ;
.

Args 内のいずれかの Ti について std:: formatter < Ti, char > BasicFormatter 要件を満たさない場合( std::make_format_args で要求される通り)、動作は未定義です。

目次

パラメータ

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

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

{ arg-id (optional) } (1)
{ arg-id (optional) : 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");  // オーバーロード (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()); // オーバーロード (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 、ファイルストリーム、またはバッファに出力する
(関数)