C++ 命名需求: FormattedOutputFunction
要求
FormattedOutputFunction 是一种执行以下操作的流输出函数
- 构造一个具有自动存储持续时间的 basic_istream::sentry 类型的对象,该对象执行以下操作
- 如果输出流上设置了 eofbit 或 badbit,则同时设置 failbit,并且如果在此输出流的异常掩码
((exceptions() & failbit) != 0)
中启用了 failbit 上的异常,则抛出 ios_base::failure。 - 如果适用,刷新 tie() 的输出流。
- 如果输出流上设置了 eofbit 或 badbit,则同时设置 failbit,并且如果在此输出流的异常掩码
- 通过调用 sentry::operator bool() 检查哨兵的状态,这等同于 basic_ios::good。
- 如果哨兵返回 false 或哨兵的构造函数抛出异常,则不会发生输出。
- 如果哨兵返回 true,则尝试通过将字符插入输出流来执行所需的输出,就像调用
rdbuf()->sputc()
一样。也可以使用 std::basic_ostream 的其他公共成员,但除了 overflow()、xsputn() 和 sync() 之外的rdbuf()
虚拟成员将永远不会被调用。- 如果无法生成输出,则设置 failbit。如果在此流的异常掩码
((exceptions() & failbit) != 0)
中启用了 failbit 上的异常,则抛出 ios_base::failure。 - 如果在输出期间抛出异常,则在输出流中设置 badbit。如果在此流的异常掩码
((exceptions() & failbit) != 0)
中启用了 badbit 上的异常,则该异常也会被重新抛出。 - 如果没有抛出异常,则返回
*this
。
- 如果无法生成输出,则设置 failbit。如果在此流的异常掩码
- 无论如何,无论是因异常终止还是返回,哨兵的析构函数都会在此函数离开之前被调用。
填充
格式化输出函数根据 std::num_put::do_put() 阶段 3 确定填充。
(直到 C++14)如果流 os
的格式化输出函数确定填充,则按以下方式进行。
给定一个 CharT 字符序列 seq
,其中 CharT 是 os
的字符类型,如果 seq
的长度小于 os.width()
,则根据需要向此序列添加足够多的 os.fill()
副本,以填充到 os.width()
字符的宽度。
如果 (os.flags() & std::ios_base::adjustfield) == std::ios_base::left
为 true
,则填充字符放在字符序列之后;否则,它们放在字符序列之前。
标准库
以下标准库函数是 FormattedOutputFunctions。
- basic_ostream::operator<<((std::basic_ostream&, int, long, double, void*, bool)
- operator<<(std::basic_ostream, char&)
- operator<<(std::basic_ostream, char*)
- operator<<(std::basic_ostream, const std::bitset&))
- operator<<(std::basic_ostream, const std::basic_string&)
- 当在 std::get_money 的返回值上调用 operator<< 时
- operator<<(std::basic_ostream&, std::basic_string_view) (自 C++17 起)
-
print(std::ostream&, std::format_string<Args...>, Args&&...),
-
println(std::ostream&, std::format_string<Args...>, Args&&...),
-
vprint_unicode(std::ostream&, std::string_view, std::format_args),
-
vprint_nonunicode(std::ostream&, std::string_view, std::format_args) , 除了(给定 os 是一个输出流对象)
- 调用 std::vformat 抛出的任何异常都会传播,不考虑
os.exceptions()
的值,并且不会在os
的错误状态中打开 ios_base::badbit>; - 如果插入到
os
失败,则调用os.setstate(ios_base::badbit)
(这可能抛出 ios_base::failure)。
- 调用 std::vformat 抛出的任何异常都会传播,不考虑
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 160 | C++98 | 确定捕获到的异常是否被重新抛出的过程提到了一个不存在的函数 exception()。 | 已更正为 exceptions()。 |
LWG 165 | C++98 | rdbuf() 上唯一允许调用的虚拟成员是 overflow() | 还允许 xsputn() 和 sync() |