C++ 具名要求:无格式输出函数 (UnformattedOutputFunction)
来自cppreference.com
要求
无格式输出函数 (UnformattedOutputFunction) 是进行下列操作的流输入函数:
1) 构造一个具有自动存储期的 basic_ostream::sentry 类型的对象,它进行下列操作:
- 如果输出流上设置了 eofbit 或 badbit,那么会一并设置 failbit,且如果此输出流的异常掩码中启用了
failbit
上的异常((exceptions() & failbit) != 0),那么就会抛出 ios_base::failure。 - 清除它所 tie() 的输出流的缓冲区,如果适用。
2) 通过调用
sentry::operator bool()
检查 sentry 的状态,这等价于 basic_ios::good。
- 如果运算符返回 false,或 sentry 的构造函数抛出了异常,那么就不会进行输出。
- 如果运算符返回 true,那么如同以调用 rdbuf()->sputc() 试图通过插入字符到输出流来进行想要的输出。std::basic_ostream 的其他公开成员也有可能会使用,但不会调用 rdbuf() 的除了 overflow(),xsputn() 和 sync() 以外的其他虚成员。
- 如果输出中抛出了异常,那么设置输出流中的
badbit
。如果此流的异常掩码中启用了badbit
上的异常((exceptions() & badbit) != 0),那么还会重抛这个异常。 - 如果没有抛出异常,那么返回该函数指定的值。
- 如果输出中抛出了异常,那么设置输出流中的
3) 在任何事件中,无论是因异常终止还是返回,离开此函数前都会调用 sentry 的析构函数。
标准库
下列标准库函数是无格式输出函数 (UnformattedOutputFunction) 。
- basic_ostream::operator<<(basic_streambuf*)
- basic_ostream::put
- basic_ostream::write
- basic_ostream::flush
|
(C++11 起) |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 63 | C++98 | 异常处理方案缺失 | 已补充 |
LWG 160 | C++98 | 确定是否需要重抛异常的流程中提到了不存在的函数 exception()
|
改成 exceptions() |
LWG 165 | C++98 | 能在 rdbuf() 上调用的虚成员只有 overflow()
|
也可以调用 xsputn() 和 sync()
|