C++ 命名需求: UnformattedOutputFunction (非格式化输出函数)
要求
一个 UnformattedOutputFunction (非格式化输出函数) 是一个执行以下操作的流输出函数:
-
构造一个类型为 basic_istream::sentry 的对象,该对象具有自动存储期,并且 noskipws 参数设置为 true,执行以下操作:
- 如果输出流上设置了 eofbit 或 badbit,则也设置 failbit,并且如果此输出流的 异常掩码
((exceptions() & failbit) != 0)
启用了 failbit 上的异常,则抛出 ios_base::failure。 - 如果适用,刷新 tie() 的输出流。
- 如果输出流上设置了 eofbit 或 badbit,则也设置 failbit,并且如果此输出流的 异常掩码
-
通过调用 sentry::operator bool() 检查哨兵的状态,这等同于 basic_ios::good。
- 如果操作符返回
false
或 sentry 的构造函数抛出异常,则不发生输出。 - 如果操作符返回
true
,则尝试通过将字符插入输出流来执行所需的输出,就像调用rdbuf()->sputc()
一样。std::basic_ostream 的其他公共成员也可以使用,但rdbuf()
的虚成员(除了 overflow()、xsputn() 和 sync())将永远不会被调用。- 如果在输出期间抛出异常,则在输出流中设置 badbit。如果此流的 异常掩码
((exceptions() & failbit) != 0)
启用了 badbit 上的异常,则也会重新抛出异常。 - 如果没有抛出异常,则返回函数指定的值。
- 如果在输出期间抛出异常,则在输出流中设置 badbit。如果此流的 异常掩码
- 如果操作符返回
-
无论如何,无论是因异常终止还是返回,哨兵的析构函数都会在此函数离开之前被调用。
标准库
以下标准库函数是 UnformattedOutputFunctions (非格式化输出函数)。
- basic_ostream::operator<<(basic_streambuf*)
- basic_ostream::put
- basic_ostream::write
- basic_ostream::flush
- basic_ostream::tellp (除了调用 pubseekoff 而不是输出) (自 C++11 起)
- basic_ostream::seekp (除了调用 pubseekoff 或 pubseekpos 而不是输出) (自 C++11 起)
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 63 | C++98 | 缺少异常处理策略 | 已添加 |
LWG 160 | C++98 | 确定捕获到的异常是否被重新抛出的过程提到了一个不存在的函数 exception()。 | 已更正为 exceptions()。 |
LWG 165 | C++98 | rdbuf() 上唯一允许调用的虚成员是 overflow() | 也允许 xsputn() 和 sync() |