跳到主要内容

C++ 命名要求:FormattedInputFunction

要求

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

  • 构造一个类型为 basic_istream::sentry 的对象,具有自动存储期,并将 noskipws 参数设置为 false,该对象执行以下操作:
    • 如果输入流上设置了 eofbitbadbit,则同时设置 failbit,并且如果此输入流的异常掩码 ((exceptions() & failbit) != 0) 中启用了 failbit 上的异常,则抛出 ios_base::failure
    • 如果适用,刷新 tie() 关联的输出流。
    • 如果此输入流上设置了 ios_base::skipws 标志,则从输入流中提取并丢弃字符,直到以下条件之一变为真:
      • 输入流上的下一个可用字符不是空白字符,如通过当前此输入流中注入的 locale 的 std::ctype facet 所测试。非空白字符未被提取。
      • 到达流的末尾,在这种情况下设置 failbit 和 eofbit,并且如果流在其中一个位上启用了异常,则抛出 ios_base::failure
  • 通过调用 sentry::operator bool() 检查哨兵的状态,这等同于 basic_ios::good
  • 如果守卫 (sentry) 返回 false 或守卫的构造函数抛出异常,则不进行输入。
  • 如果守卫返回 true,则执行输入,如同通过调用 rdbuf()->sbumpc()rdbuf()->sgetc()
    • 如果到达流的末尾(调用 rdbuf()->sbumpc()rdbuf()->sgetc() 返回 Traits::eof()),则设置 eofbit。如果此流的异常掩码 ((exceptions() & eofbit) != 0) 中启用了 eofbit 上的异常,则抛出 ios_base::failure
    • 如果在输入期间抛出异常,则在输入流中设置 badbit。如果此流的异常掩码 ((exceptions() & badbit) != 0) 中启用了 badbit 上的异常,则异常也会被重新抛出。
    • 如果未抛出异常,则返回 *this
  • 无论如何,无论是因异常终止还是返回,哨兵的析构函数都会在此函数离开之前被调用。

标准库

以下标准库函数是 FormattedInputFunctions。

缺陷报告

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

DR应用于发布时的行为正确行为
LWG 160C++98确定捕获到的异常是否被重新抛出的过程提到了一个不存在的函数 exception()。已更正为 exceptions()。

C++ 命名要求:FormattedInputFunction

要求

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

  • 构造一个类型为 basic_istream::sentry 的对象,具有自动存储期,并将 noskipws 参数设置为 false,该对象执行以下操作:
    • 如果输入流上设置了 eofbitbadbit,则同时设置 failbit,并且如果此输入流的异常掩码 ((exceptions() & failbit) != 0) 中启用了 failbit 上的异常,则抛出 ios_base::failure
    • 如果适用,刷新 tie() 关联的输出流。
    • 如果此输入流上设置了 ios_base::skipws 标志,则从输入流中提取并丢弃字符,直到以下条件之一变为真:
      • 输入流上的下一个可用字符不是空白字符,如通过当前此输入流中注入的 locale 的 std::ctype facet 所测试。非空白字符未被提取。
      • 到达流的末尾,在这种情况下设置 failbit 和 eofbit,并且如果流在其中一个位上启用了异常,则抛出 ios_base::failure
  • 通过调用 sentry::operator bool() 检查哨兵的状态,这等同于 basic_ios::good
  • 如果守卫 (sentry) 返回 false 或守卫的构造函数抛出异常,则不进行输入。
  • 如果守卫返回 true,则执行输入,如同通过调用 rdbuf()->sbumpc()rdbuf()->sgetc()
    • 如果到达流的末尾(调用 rdbuf()->sbumpc()rdbuf()->sgetc() 返回 Traits::eof()),则设置 eofbit。如果此流的异常掩码 ((exceptions() & eofbit) != 0) 中启用了 eofbit 上的异常,则抛出 ios_base::failure
    • 如果在输入期间抛出异常,则在输入流中设置 badbit。如果此流的异常掩码 ((exceptions() & badbit) != 0) 中启用了 badbit 上的异常,则异常也会被重新抛出。
    • 如果未抛出异常,则返回 *this
  • 无论如何,无论是因异常终止还是返回,哨兵的析构函数都会在此函数离开之前被调用。

标准库

以下标准库函数是 FormattedInputFunctions。

缺陷报告

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

DR应用于发布时的行为正确行为
LWG 160C++98确定捕获到的异常是否被重新抛出的过程提到了一个不存在的函数 exception()。已更正为 exceptions()。