std::basic_ostream<CharT,Traits>::sentry
来自cppreference.com
<tbody>
</tbody>
class sentry; |
||
在 std::basic_ostream 的每个进行输出(有格式与无格式)的成员函数起始,于局部作用域中构造一个类 basic_ostream::sentry 的对象。它的构造函数准备输出流:检查流是否已在失败状态,冲洗所 tie() 的输出流,并且在需要时进行其他由实现定义的任务。实现定义的清理,还有在必要时的输出流冲洗,在其析构函数中进行,从而保证输出中抛出异常时会得到执行。
成员函数
| 构造 sentry 对象。所有准备任务都在此完成。 (公开成员函数) | |
| 在有格式输入后或异常后在必要情况下终止化流对象 (公开成员函数) | |
operator= |
赋值运算符被弃置 (公开成员函数) |
| 检查流对象的准备是否成功 (公开成员函数) |
std::basic_ostream::sentry::sentry
<tbody> </tbody> 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
<tbody> </tbody> ~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
<tbody> </tbody> 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(),它是无格式输出函数 (UnformattedOutputFunction) ,因此会构造另一个 sentry 对象(它的析构函数又会构造其他 sentry 对象,以此类推) |
此时改成调用os.rdbuf()->pubsync()
|
参阅
| 插入带格式数据 (公开成员函数) |