std::basic_ostream<CharT,Traits>:: sentry
|
class
sentry
;
|
||
在每个执行输出(包括格式化和非格式化)的
std::basic_ostream
成员函数开始时,会在局部作用域构造一个
basic_ostream::sentry
类对象。其构造函数负责准备输出流:检查流是否已处于失败状态,刷新被关联的 tie() 输出流,并在必要时执行其他实现定义的任务。实现定义的清理工作以及在必要时对输出流的刷新操作会在析构函数中执行,这确保了即使在输出过程中抛出异常,这些操作也能保证执行。
目录 |
成员函数
|
(constructor)
|
构造哨兵对象。所有准备工作在此完成
(公开成员函数) |
|
(destructor)
|
必要时在格式化输出或异常后完成流对象的最终处理
(公开成员函数) |
|
operator=
|
赋值运算符被删除
(公开成员函数) |
|
operator bool
|
检查流对象准备是否成功
(公开成员函数) |
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++标准。
| 缺陷报告 | 适用版本 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 397 | C++98 | 析构函数可能调用 os. flush ( ) ,这可能抛出异常 | 异常不会被传播 |
| LWG 442 | C++98 | operator bool 未声明为 const (在 概要 中为 const ) | 添加 const 限定符 |
| LWG 835 | C++98 |
若
os
设置了
unitbuf
,析构函数将调用
os.
flush
(
)
,
这是一个 无格式输出函数 并会创建另一个哨兵对象 (其析构函数随后会创建另一个哨兵对象,依此类推) |
在此情况下改为调用
os. rdbuf ( ) - > pubsync ( ) |
参见
|
插入格式化数据
(公开成员函数) |