C++ 名前付き要件: FormattedOutputFunction
From cppreference.com
目次 |
[編集] 要件
FormattedOutputFunction は、以下の処理を実行するストリーム出力関数です。
- 自動記憶域期間を持つ basic_ostream::sentry 型のオブジェクトを構築します。このオブジェクトは以下の処理を実行します。
- 出力ストリームで eofbit または badbit が設定されている場合、`failbit` も設定します。また、この出力ストリームの 例外マスク で `failbit` に対する例外が有効になっている場合((exceptions() & failbit) != 0)、ios_base::failure をスローします。
- 該当する場合、tie() されている出力ストリームをフラッシュします。
- `sentry::operator bool()` を呼び出すことで sentry の状態をチェックします。これは basic_ios::good と同等です。
- sentry が false を返したか、または sentry のコンストラクタが例外をスローした場合、出力は行われません。
- sentry が true を返した場合、rdbuf()->sputc() を呼び出すかのように、文字を出力ストリームに挿入することによって、目的の出力を試みます。std::basic_ostream の他のパブリックメンバーも使用される可能性がありますが、rdbuf() の仮想メンバーで overflow()、xsputn()、および sync() 以外は決して呼び出されません。
- 出力が生成できなかった場合、`failbit` を設定します。このストリームの 例外マスク で `failbit` に対する例外が有効になっている場合((exceptions() & failbit) != 0)、ios_base::failure をスローします。
- 出力中に例外がスローされた場合、出力ストリームの `badbit` を設定します。このストリームの 例外マスク で `badbit` に対する例外が有効になっている場合((exceptions() & badbit) != 0)、その例外も再スローされます。
- 例外がスローされなかった場合、*this を返します。
- いずれの場合も、例外による終了か戻りかに関わらず、この関数を離れる前に sentry のデストラクタが呼び出されます。
[編集] パディング
|
フォーマット済み出力関数は、std::num_put::do_put() のステージ 3 に従ってパディングを決定します。 |
(C++14まで) |
|
ストリーム os のフォーマット済み出力関数がパディングを決定する場合、以下のようになります。 seq という もし (os.flags() & std::ios_base::adjustfield) = std::ios_base::left が true であれば、埋め文字は文字シーケンスの後に配置されます。そうでなければ、文字シーケンスの前に配置されます。 |
(C++14以降) |
[編集] 標準ライブラリ
以下の標準ライブラリ関数は FormattedOutputFunction です。
- basic_ostream::operator<<(std::basic_ostream&, int / long / double / void* / bool)
- operator<<(std::basic_ostream&, char)
- operator<<(std::basic_ostream&, char*)
- operator<<(std::basic_ostream&, const std::bitset&)
- operator<<(std::basic_ostream&, const std::basic_string&)
- std::put_money の戻り値に対して呼び出された場合の `operator<<`
| (C++17以降) |
|
(C++23から) |
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 160 | C++98 | キャッチされた例外が 再スローされるかどうかを決定するプロセスで、存在しない関数 `exception()` に言及していましたが、 |
exceptions() に修正されました。 |
| LWG 165 | C++98 | 許可される唯一の仮想メンバーは rdbuf() に対して呼び出されたのは `overflow()` でした。 |
も許可xsputn() および `sync()` |