C++ 具名要求:有格式输入函数 (FormattedInputFunction)
来自cppreference.com
要求
有格式输入函数 (FormattedInputFunction) 是进行下列操作的流输入函数:
- 构造一个具有自动存储期的 basic_istream::sentry 类型的对象,并将
noskipws
实参设为 false,这会进行下列操作:
- 如果输入流已经设置了 eofbit 或 badbit,那么会一并设置
failbit
,且如果此输入流的异常掩码中启用了failbit
上的异常((exceptions() & failbit) != 0),那么会抛出 ios_base::failure。 - 清除它所 tie() 的输出流的缓冲区,如果适用。
- 如果输入流已经设置了
ios_base::skipws
标志,那么提取并舍弃来自输入流的字符,直到满足下列任一条件:
- 输入流上的下个可用字符不是空白字符(以此输入流中当前浸染的本地环境的 std::ctype 平面进行检测)。不提取非空白字符。
- 抵达流尾,此时设置
failbit
和eofbit
,而且如果该流开启了这些位之一上的异常,那么就会抛出 ios_base::failure。
- 如果输入流已经设置了 eofbit 或 badbit,那么会一并设置
- 通过调用
sentry::operator bool()
检查 sentry 的状态,这等价于 basic_ios::good。 - 如果 sentry 返回 false 或 sentry 的构造函数抛异常,那么就不会发生输入。
- 如果 sentry 返回 true,那么如同通过调用 rdbuf()->sbumpc() 或 rdbuf()->sgetc() 一样进行输入。
- 如果抵达了流尾(对 rdbuf()->sbumpc() 或 rdbuf()->sgetc() 的调用返回 Traits::eof()),那么设置
eofbit
。如果此流的异常掩码中启用了eofbit
上的异常((exceptions() & eofbit) != 0),那么就会抛出 ios_base::failure。 - 如果输入过程中抛出了异常,那么设置输入流中的
badbit
。如果此流的异常掩码中启用了badbit
上的异常((exceptions() & badbit) != 0),那么还要重抛这个异常。 - 如果输入过程中没有抛出异常,那么返回 *this。
- 如果抵达了流尾(对 rdbuf()->sbumpc() 或 rdbuf()->sgetc() 的调用返回 Traits::eof()),那么设置
- 任何事件中,无论是因异常终止还是返回,离开此函数前都会调用 sentry 的析构函数。
标准库
下列标准库函数是有格式输入函数 (FormattedInputFunction) 。
- 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++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 160 | C++98 | 确定是否需要重抛异常的流程中提到了不存在的函数 exception()
|
改成 exceptions() |