C++ 命名要求:FormattedInputFunction
要求
一个 FormattedInputFunction 是一个执行以下操作的流输入函数:
- 构造一个类型为 basic_istream::sentry 的对象,具有自动存储期,并将 noskipws 参数设置为
false
,该对象执行以下操作:- 如果输入流上设置了 eofbit 或 badbit,则同时设置 failbit,并且如果此输入流的异常掩码
((exceptions() & failbit) != 0)
中启用了 failbit 上的异常,则抛出 ios_base::failure。 - 如果适用,刷新 tie() 关联的输出流。
- 如果此输入流上设置了 ios_base::skipws 标志,则从输入流中提取并丢弃字符,直到以下条件之一变为真:
- 输入流上的下一个可用字符不是空白字符,如通过当前此输入流中注入的 locale 的 std::ctype facet 所测试。非空白字符未被提取。
- 到达流的末尾,在这种情况下设置 failbit 和 eofbit,并且如果流在其中一个位上启用了异常,则抛出 ios_base::failure。
- 如果输入流上设置了 eofbit 或 badbit,则同时设置 failbit,并且如果此输入流的异常掩码
- 通过调用 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。
- basic_istream::operator>>(int, long, double, void*, bool)
- operator>>(std::basic_istream, char&)
- operator>>(std::basic_istream, char*)
- operator>>(std::basic_istream, std::bitset)
- operator>>(std::basic_istream, std::string)
- operator>>,当在 std::get_money 的返回值上调用时。
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 160 | C++98 | 确定捕获到的异常是否被重新抛出的过程提到了一个不存在的函数 exception()。 | 已更正为 exceptions()。 |