跳到主要内容

C++ 命名需求: FormattedOutputFunction

要求

FormattedOutputFunction 是一种执行以下操作的流输出函数

  • 构造一个具有自动存储持续时间的 basic_istream::sentry 类型的对象,该对象执行以下操作
    • 如果输出流上设置了 eofbitbadbit,则同时设置 failbit,并且如果在此输出流的异常掩码 ((exceptions() & failbit) != 0) 中启用了 failbit 上的异常,则抛出 ios_base::failure
    • 如果适用,刷新 tie() 的输出流。
  • 通过调用 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
  • 无论如何,无论是因异常终止还是返回,哨兵的析构函数都会在此函数离开之前被调用。

填充

格式化输出函数根据 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::lefttrue,则填充字符放在字符序列之后;否则,它们放在字符序列之前。

 (自 C++14 起)

标准库

以下标准库函数是 FormattedOutputFunctions。

 (自 C++23 起)

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 160C++98确定捕获到的异常是否被重新抛出的过程提到了一个不存在的函数 exception()。已更正为 exceptions()。
LWG 165C++98rdbuf() 上唯一允许调用的虚拟成员是 overflow()还允许 xsputn() 和 sync()

C++ 命名需求: FormattedOutputFunction

要求

FormattedOutputFunction 是一种执行以下操作的流输出函数

  • 构造一个具有自动存储持续时间的 basic_istream::sentry 类型的对象,该对象执行以下操作
    • 如果输出流上设置了 eofbitbadbit,则同时设置 failbit,并且如果在此输出流的异常掩码 ((exceptions() & failbit) != 0) 中启用了 failbit 上的异常,则抛出 ios_base::failure
    • 如果适用,刷新 tie() 的输出流。
  • 通过调用 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
  • 无论如何,无论是因异常终止还是返回,哨兵的析构函数都会在此函数离开之前被调用。

填充

格式化输出函数根据 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::lefttrue,则填充字符放在字符序列之后;否则,它们放在字符序列之前。

 (自 C++14 起)

标准库

以下标准库函数是 FormattedOutputFunctions。

 (自 C++23 起)

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 160C++98确定捕获到的异常是否被重新抛出的过程提到了一个不存在的函数 exception()。已更正为 exceptions()。
LWG 165C++98rdbuf() 上唯一允许调用的虚拟成员是 overflow()还允许 xsputn() 和 sync()