跳到主要内容

C++ 命名要求: UnformattedInputFunction(非格式化输入函数)

要求

一个 UnformattedInputFunction(非格式化输入函数)是一个执行以下操作的流输入函数:

  • 构造一个具有自动存储期且 noskipws 参数设置为 truebasic_istream::sentry 类型的对象,该对象执行以下操作:

    • 如果输入流上设置了 eofbitbadbit,则同时设置 failbit,并且如果此输入流的 异常掩码 ((exceptions() & failbit) != 0) 启用了 failbit 上的异常,则抛出 ios_base::failure
    • 如果适用,刷新 tie() 关联的输出流。
  • 通过调用 sentry::operator bool() 检查哨兵的状态,这等同于 basic_ios::good

    • 如果操作符返回 false 或哨兵的构造函数抛出异常:
      • 将输入流中提取的字符数 (gcount) 设置为零。
      • 如果函数被调用以写入 CharT 数组,则将 CharT() (空字符) 写入数组的第一个位置。
    • 如果操作符返回 true,则执行输入,如同通过调用 rdbuf()->sbumpc()rdbuf()->sgetc()
      • 如果到达流的末尾(调用 rdbuf()->sbumpc()rdbuf()->sgetc() 返回 Traits::eof()),则设置 eofbit。如果此流的 异常掩码 ((exceptions() & eofbit) != 0) 启用了 eofbit 上的异常,则抛出 ios_base::failure
      • 如果在输入过程中抛出异常,则在输入流中设置 badbit。如果此流的 异常掩码 ((exceptions() & badbit) != 0) 启用了 badbit 上的异常,则异常也会被重新抛出。
      • 如果在输入过程中没有抛出异常,则设置输入流中提取的字符数 (gcount)。
  • 无论如何,无论是因异常终止还是返回,哨兵的析构函数都会在此函数离开之前被调用。

标准库

以下标准库函数是 UnformattedInputFunction(非格式化输入函数)。

缺陷报告

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

DR应用于发布时的行为正确行为
LWG 61C++98关于是否因设置 eofbit 和/或 failbit 而抛出异常会导致设置 badbit,这一点尚不明确。从 basic_ios::clear 抛出的异常不会被捕获或重新抛出。
LWG 160C++98确定捕获到的异常是否被重新抛出的过程提到了一个不存在的函数 exception()。已更正为 exceptions()。
LWG 243C++98当 sentry::operator bool() 返回 false 或 sentry 对象构造失败时的行为未被指定。已指定。

C++ 命名要求: UnformattedInputFunction(非格式化输入函数)

要求

一个 UnformattedInputFunction(非格式化输入函数)是一个执行以下操作的流输入函数:

  • 构造一个具有自动存储期且 noskipws 参数设置为 truebasic_istream::sentry 类型的对象,该对象执行以下操作:

    • 如果输入流上设置了 eofbitbadbit,则同时设置 failbit,并且如果此输入流的 异常掩码 ((exceptions() & failbit) != 0) 启用了 failbit 上的异常,则抛出 ios_base::failure
    • 如果适用,刷新 tie() 关联的输出流。
  • 通过调用 sentry::operator bool() 检查哨兵的状态,这等同于 basic_ios::good

    • 如果操作符返回 false 或哨兵的构造函数抛出异常:
      • 将输入流中提取的字符数 (gcount) 设置为零。
      • 如果函数被调用以写入 CharT 数组,则将 CharT() (空字符) 写入数组的第一个位置。
    • 如果操作符返回 true,则执行输入,如同通过调用 rdbuf()->sbumpc()rdbuf()->sgetc()
      • 如果到达流的末尾(调用 rdbuf()->sbumpc()rdbuf()->sgetc() 返回 Traits::eof()),则设置 eofbit。如果此流的 异常掩码 ((exceptions() & eofbit) != 0) 启用了 eofbit 上的异常,则抛出 ios_base::failure
      • 如果在输入过程中抛出异常,则在输入流中设置 badbit。如果此流的 异常掩码 ((exceptions() & badbit) != 0) 启用了 badbit 上的异常,则异常也会被重新抛出。
      • 如果在输入过程中没有抛出异常,则设置输入流中提取的字符数 (gcount)。
  • 无论如何,无论是因异常终止还是返回,哨兵的析构函数都会在此函数离开之前被调用。

标准库

以下标准库函数是 UnformattedInputFunction(非格式化输入函数)。

缺陷报告

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

DR应用于发布时的行为正确行为
LWG 61C++98关于是否因设置 eofbit 和/或 failbit 而抛出异常会导致设置 badbit,这一点尚不明确。从 basic_ios::clear 抛出的异常不会被捕获或重新抛出。
LWG 160C++98确定捕获到的异常是否被重新抛出的过程提到了一个不存在的函数 exception()。已更正为 exceptions()。
LWG 243C++98当 sentry::operator bool() 返回 false 或 sentry 对象构造失败时的行为未被指定。已指定。