Namespaces
Variants

C++ named requirements: UnformattedInputFunction

From cppreference.net
C++ named requirements

要求

一个 UnformattedInputFunction 是执行以下操作的流输入函数:

1) 构造一个具有自动存储持续时间且 noskipws 参数设为 true basic_istream::sentry 类型对象,该操作执行以下步骤:
  • 若输入流中已设置 eofbit badbit ,则同时设置 failbit ;若此输入流的 异常掩码 中已启用针对 failbit 的异常( ( exceptions ( ) & failbit ) ! = 0 ),则抛出 ios_base::failure
  • 若存在关联的输出流,则刷新该通过 tie() 绑定的输出流。
2) 通过调用 sentry::operator bool() 检查岗哨状态,该操作等价于 basic_ios::good
  • 若该运算符返回 false 或岗哨构造函数抛出异常:
  • 将输入流中已提取字符数(gcount)设为零。
  • 若函数被调用以写入 CharT 数组,则向数组首位置写入 CharT() (空字符)。
  • 若该运算符返回 true ,则执行输入操作,其行为类似于调用 rdbuf ( ) - > sbumpc ( ) rdbuf ( ) - > sgetc ( )
  • 若到达流末尾(调用 rdbuf ( ) - > sbumpc ( ) rdbuf ( ) - > sgetc ( ) 返回 Traits :: eof ( ) ),则设置 eofbit 。若此流的 异常掩码 中启用了 eofbit 异常( ( exceptions ( ) & eofbit ) ! = 0 ),则抛出 ios_base::failure
  • 若输入过程中抛出异常,则在输入流中设置 badbit 。若此流的 异常掩码 中启用了 badbit 异常( ( exceptions ( ) & badbit ) ! = 0 ),则同时重新抛出该异常。
  • 若输入过程中未抛出异常,则设置输入流中已提取字符数(gcount)。
3) 在任何情况下,无论是因异常终止还是正常返回,哨兵对象的析构函数都会在离开此函数前被调用。

标准库

以下标准库函数属于 UnformattedInputFunction s

缺陷报告

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

缺陷报告 适用标准 发布时行为 正确行为
LWG 61 C++98 不清楚因设置
eofbit 和/或 failbit 而抛出异常是否会导致设置 badbit
basic_ios::clear
抛出的异常不会被捕获或重新抛出
LWG 160 C++98 判断捕获的异常是否重新抛出的过程
提及了不存在的函数 exception()
修正为 exceptions()
LWG 243 C++98 sentry::operator bool() 返回 false
或哨兵对象构造失败时的行为未作规定
已明确规定