std::basic_ostream<CharT,Traits>::sentry
| class sentry; |
||
クラスbasic_ostream::sentryのオブジェクトは、フォーマット済み出力および非フォーマット済み出力の両方を行うstd::basic_ostreamの各メンバ関数の先頭でローカルスコープで構築されます。そのコンストラクタは出力ストリームを準備します:ストリームが既に失敗状態にあるかチェックし、tie()されている出力ストリームをフラッシュし、必要に応じて他の実装定義のタスクを実行します。実装定義のクリーンアップは、必要に応じて出力ストリームのフラッシュとともにデストラクタで実行されるため、出力中に例外がスローされた場合でも確実に発生することが保証されます。
目次 |
[編集] メンバ関数
| (コンストラクタ) |
sentryオブジェクトを構築します。すべての準備タスクはここで実行されます (public member function) |
| (デストラクタ) |
必要に応じて、フォーマット済み出力の後、または例外の後でストリームオブジェクトを最終処理します (public member function) |
| operator= |
代入演算子は削除されています (public member function) |
| operator bool |
ストリームオブジェクトの準備が成功したかどうかをチェックします (public member function) |
std::basic_ostream::sentry::sentry
| explicit sentry( std::basic_ostream<CharT, Traits>& os ); |
||
フォーマット済み出力のためにストリームを準備します。
os.good()がfalseの場合、戻ります。それ以外の場合、os.tie()がヌルポインタでない場合、外部ストリームと出力シーケンスを同期するためにos.tie()->flush()を呼び出します。準備中、コンストラクタはsetstate(failbit)(std::ios_base::failureをスローする可能性があります)を呼び出すことがあります。
準備が完了した後、os.good() = true の場合、operator bool への後続の呼び出しはtrueを返します。
パラメータ
| os | - | 準備する出力ストリーム |
例外
std::ios_base::failure ファイル終端条件が発生した場合。
std::basic_ostream::sentry::~sentry
| ~sentry(); |
||
(os.flags() & std::ios_base::unitbuf) && !std::uncaught_exception() && os.good())がtrueの場合、os.rdbuf()->pubsync()を呼び出します。その関数が-1を返す場合、例外を伝播せずにos.rdstate()にbadbitを設定します。
std::basic_ostream::sentry::operator bool
| explicit operator bool() const; |
||
出力ストリームの準備が成功したかどうかをチェックします。
パラメータ
(なし)
戻り値
出力ストリームの準備が成功した場合はtrue、それ以外の場合はfalse。
[編集] 例
#include <iostream> #include <sstream> struct Foo { char n[6]; }; std::ostream& operator<<(std::ostream& os, Foo& f) { std::ostream::sentry s(os); if (s) os.write(f.n, 5); return os; } int main() { Foo f = {"abcde"}; std::cout << f << '\n'; }
出力
abcde
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 397 | C++98 | デストラクタはos.flush()を呼び出す可能性があり、これは例外をスローする可能性があります | 例外は伝播されません |
| LWG 442 | C++98 | operator bool はconst として宣言されていませんでした(シノプシスではconstです) | const が追加されました |
| LWG 835 | C++98 | osがunitbufを設定すると、デストラクタはos.flush()を呼び出しますが、これは(デストラクタがさらにsentryオブジェクトを作成し、以下同様に繰り返される)UnformattedOutputFunctionであり、別のsentryオブジェクトを作成します (そのデストラクタがさらにsentryオブジェクトを作成し、以下同様に繰り返される) |
呼び出します os.rdbuf()->pubsync() この場合、代わりに |
[編集] 関連項目
| 書式付きデータを挿入する (public member function) |