std::basic_ostream<CharT,Traits>::sentry

来自cppreference.com
< cpp‎ | io‎ | basic ostream
 
 
 
 
class sentry;

basic_ostream::sentry 的对象在 std::basic_ostream 的每个进行输出(有格式与无格式)的成员函数起始的局部作用域中构造。它的构造函数准备输出流:检查流是否已在失败状态,冲入所 tie() 的输出流,并且在需要时进行其他由实现定义的任务。实现定义的清理,还有在必要时的输出流冲入,在析构函数中进行,从而保证输出中抛出异常时会得到执行。

成员函数

(构造函数)
构造 sentry 对象。所有准备任务都在此完成。
(公开成员函数)
(析构函数)
在有格式输入后或异常后在必要情况下终止化流对象
(公开成员函数)
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(),它是
无格式输出函数 (UnformattedOutputFunction) ,因此会构造另一个
sentry 对象(它的析构函数又会构造其他 sentry 对象,以此类推)
此时改成调用
os.rdbuf()->pubsync()

参阅

插入带格式数据
(公开成员函数)