最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<ostream>

# std::vprint_unicode(C++23)

    namespace std {
      void vprint_unicode(ostream& os,
                          string_view fmt,
                          format_args args); // (1) C++23
    }

## 概要

書式指定でUnicode出力する。

- (1) : 指定した`ostream`に、書式指定でUnicode出力する

デフォルトの標準出力に出力したい場合は、`<print>`ヘッダの`std::vprint_unicode()`関数を使用すること。

## 効果

- `os`の書式化出力関数として振る舞うが、以下の点が異なる：
  - 出力の生成失敗は、以下で規定されるように報告される
  - `vformat()`関数よって送出された例外は、`os.exceptions()`の値に関係なく、また`os`のエラー状態として`ios_base::badbit`をオンにすることなく、伝播される。

- `sentry`オブジェクトを構築した後、以下のように自動変数を初期化する：

      string out = vformat(fmt, args);

- `os`が実装定義されたUnicodeを表示できる端末を参照するストリームである場合、ネイティブのUnicode APIを使用して端末に書き出す

- `out`に無効なコードユニットが含まれる場合、その動作は未定義であり，実装者はそれを診断することが推奨される
- ネイティブのUnicode APIを使用する場合、この関数は`out`を書き出す前にフラッシュする

## 例外

- `vformat()`関数がなんらかの例外を送出する可能性がある
- 端末かストリームへの書き込みに失敗した場合、`system_error`を送出する
- `bad_alloc`を送出する可能性がある

## 備考

- 推奨の方式：ネイティブのUnicode APIを呼び出す際に文字コード変換が必要な場合、実装はUnicode標準 (Unicode Standard Version 14.0 - Core Specification, Chapter 3.9) に従って無効なコードユニットを「U+FFFD REPLACEMENT CHARACTER」で置き換える必要がある

## バージョン

### 言語

- C++23

### 処理系

- Clang: 19 ✅
- GCC: 14 ✅
- ICC: ??
- Visual C++: 2022 Update 7 ✅

## 関連項目

- `std::print()`
- `std::println()`
- `std::vprint_nonunicode()`

## 参照

- P2093R14 Formatted output
- P2539R4 Should the output of `std::print` to a terminal be synchronized with the underlying stream?