C++ 具名要求:有格式输出函数 (FormattedOutputFunction)

来自cppreference.com
< cpp‎ | named req
 
 
C++ 具名要求
基础
类型属性
库所属
容器
容器元素
(C++11)

迭代器
流 I/O
FormattedOutputFunction

格式化
(C++20)
随机数
(C++11)    
并发
(C++11)
(C++11)
范围
其他
(C++11)


 

要求

有格式输出函数 (FormattedOutputFunction) 是进行下列操作的流输出函数:

  • 构造一个具有自动存储期的 basic_ostream::sentry类型的对象,这会进行下列操作:
  • 如果输入流已经设置了 eofbitbadbit,那么会一并设置 failbit,且如果此输入流的异常掩码中启用了 failbit 上的异常((exceptions() & failbit) != 0),那么就会抛出 ios_base::failure
  • 清除它所 tie() 的输出流的缓冲区,如果适用。
  • 通过调用 sentry::operator bool() 检查 sentry 的状态,这等价于 basic_ios::good
  • 如果 sentry 返回 false,或 sentry 的构造函数抛出了异常,那么就不会进行输出。
  • 如果运算符返回 true,那么如同以调用 rdbuf()->sputc() 试图通过插入字符到输出流来进行想要的输出。std::basic_ostream 的其他公开成员也有可能会使用,但不会调用 rdbuf() 的除了 overflow()xsputn()sync() 以外的其他虚成员。
  • 如果无法生成输出,那么就会设置 failbit。如果此流的异常掩码中启用了 failbit 上的异常((exceptions() & failbit) != 0),那么就会抛出 ios_base::failure
  • 如果输出中抛出了异常,那么就会设置输出流中的 badbit。如果此流的异常掩码中启用了 badbit 上的异常((exceptions() & badbit) != 0),那么还会重抛该异常。
  • 如果没有抛出异常,那么返回 *this
  • 任何事件中,无论是因异常终止还是返回,都会在离开此函数前调用 sentry 的析构函数。

填充

有格式输出函数根据 std::num_put::do_put() 阶段 3 的规则决定如何填充。

(C++14 前)

os 的有格式输出函数通过以下方式决定如何填充。

给定一个 CharT 字符序列 seq(其中 CharTos 的字符类型),如果 seq 的长度小于 os.width(),那么足够数量的 os.fill() 副本会添加到这个序列以确保填充到 os.width() 个字符的宽度。

如果 (os.flags() & std::ios_base::adjustfield) == std::ios_base::lefttrue,那么会在字符序列后面填充;否则会在字符序列前面填充。

(C++14 起)

标准库

下列标准库函数是有格式输出函数 (FormattedOutputFunction)

(C++17 起)


但是(给定输出流对象 os):
(C++23 起)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 160 C++98 确定是否需要重抛异常的流程中提到了不存在的函数 exception() 改成 exceptions()
LWG 165 C++98 能在 rdbuf() 上调用的虚成员只有 overflow() 也可以调用 xsputn()sync()