名前空間
変種
操作

C++ 名前付き要件: FormattedOutputFunction

From cppreference.com
 
 
C++ 名前付き要件
 

目次

[編集] 要件

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 という CharT 文字シーケンスが与えられ、ここで CharTos文字コンテナ型 である場合、seq の長さが os.width() より短い場合、os.width() 文字の幅になるように、os.fill() のコピーがこのシーケンスに追加されます。

もし (os.flags() & std::ios_base::adjustfield) = std::ios_base::lefttrue であれば、埋め文字は文字シーケンスの後に配置されます。そうでなければ、文字シーケンスの前に配置されます。

(C++14以降)

[編集] 標準ライブラリ

以下の標準ライブラリ関数は FormattedOutputFunction です。

(C++17以降)
ただし、(os が出力ストリームオブジェクトであると仮定して)
  • std::vformat の呼び出しによってスローされた例外は、os.exceptions() の値に関係なく、また os のエラー状態に ios_base::badbit を設定することなく、伝播します。
  • os への挿入が失敗した場合、 os.setstate(ios_base::badbit) を呼び出します(これは ios_base::failure をスローする可能性があります)。
(C++23から)

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 160 C++98 キャッチされた例外が
再スローされるかどうかを決定するプロセスで、存在しない関数 `exception()` に言及していましたが、
exceptions() に修正されました。
LWG 165 C++98 許可される唯一の仮想メンバーは
rdbuf() に対して呼び出されたのは `overflow()` でした。
も許可
xsputn() および `sync()`
English 日本語 中文(简体) 中文(繁體)