命名空间
变体
操作

C++ 命名要求: FormattedOutputFunction

来自 cppreference.cn
 
 
C++ 命名要求
基本
类型属性
全库范围




Container(容器)
容器元素
迭代器 (Iterator)
流 I/O
FormattedOutputFunction(格式化输出函数)
格式化器
(C++20)
随机数
并发
(C++11)
Ranges
多维视图
其他

 

目录

[编辑] 要求

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

  • 如果输出流上设置了 eofbitbadbit,则也设置 failbit,并且如果此输出流的 异常掩码 中启用了 failbit 上的异常((exceptions() & failbit) != 0),则抛出 ios_base::failure
  • 如果适用,刷新 tie() 的输出流。
  • 通过调用 sentry::operator bool() 检查岗哨的状态,这等效于 basic_ios::good
  • 如果岗哨返回 false 或岗哨的构造函数抛出异常,则不进行输出。
  • 如果岗哨返回 true,则尝试通过将字符插入输出流来执行所需的输出,如同通过调用 rdbuf()->sputc()。还可以使用 std::basic_ostream 的其他公共成员,但除了 overflow()xsputn()sync() 之外,rdbuf() 的虚成员永远不会被调用。
  • 如果无法生成输出,则设置 failbit。如果此流的 异常掩码 中启用了 failbit 上的异常((exceptions() & failbit) != 0),则抛出 ios_base::failure
  • 如果在输出期间抛出异常,则在输出流中设置 badbit。如果此流的 异常掩码 中启用了 badbit 上的异常((exceptions() & badbit) != 0),则该异常也会被重新抛出。
  • 如果没有抛出异常,则返回 *this
  • 无论如何,无论是通过异常终止还是返回,岗哨的析构函数都会在此函数退出之前被调用。

[编辑] 填充

格式化输出函数根据 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 起)

[编辑] 标准库

以下标准库函数是 FormattedOutputFunctions

(C++17 起)
但(给定 os 是一个输出流对象)
  • 调用 std::vformat 抛出的任何异常都会被传播,而不管 os.exceptions() 的值,并且不会在 os 的错误状态中打开 ios_base::badbit
  • 如果插入 os 失败,则调用 os.setstate(ios_base::badbit)(这可能会抛出 ios_base::failure)。
(C++23 起)

[编辑] 缺陷报告

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

缺陷报告 应用于 发布时的行为 正确的行为
LWG 160 C++98 确定捕获的异常是否重新抛出的过程
提到了一个不存在的函数 exception()
更正为 exceptions()
LWG 165 C++98 唯一允许对
rdbuf() 调用的虚成员是 overflow()
也允许
xsputn()sync()
English 日本語 中文(简体) 中文(繁體)