C++ 具名要求:无格式输入函数 (UnformattedInputFunction)
来自cppreference.com
要求
无格式输入函数 (UnformattedInputFunction) 是进行下列操作的流输入函数:
1) 构造具有自动存储期的 basic_istream::sentry 类型的对象,并将
noskipws
实参设为 true,这会进行下列操作:
- 如果输入流已经设置了 eofbit 或 badbit,那么会一并设置 failbit,且如果此输入流的异常掩码中启用了
failbit
上的异常((exceptions() & failbit) != 0),那么会抛出 ios_base::failure。 - 清除它所 tie() 的输出流的缓冲区,如果适用。
2) 通过调用
sentry::operator bool()
检查 sentry 的状态,这等价于 basic_ios::good。
- 如果运算符返回 false 或 sentry 的构造函数抛出了异常,那么:
- 设置输入流中的已提取字符数(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),那么还要重抛这个异常。
- 从 basic_ios::clear 中抛出的异常不会被捕获或重抛。
- 如果输入过程中没有抛出异常,那么就会设置输入流中的已提取字符数(gcount)。
- 如果抵达了流尾(对 rdbuf()->sbumpc() 或 rdbuf()->sgetc() 的调用返回 Traits::eof()),那么设置
3) 在任何事件中,无论是异常终止还是返回,离开此函数前都会调用 sentry 的析构函数。
标准库
下列标准库函数是无格式输入函数 (UnformattedInputFunction) 。
- std::getline,除了不修改 gcount
- basic_istream::operator>>(basic_streambuf*)
- basic_istream::get
- basic_istream::getline
- basic_istream::ignore
- basic_istream::peek
- basic_istream::read
- basic_istream::readsome
- basic_istream::putback,除了首先清除
eofbit
- basic_istream::unget,除了首先清除
eofbit
- basic_istream::sync,除了不修改 gcount
- basic_istream::tellg,除了不修改 gcount
- basic_istream::seekg,除了首先清除
eofbit
且不修改 gcount - std::ws,除了不修改 gcount
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 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 或 sentry 对象构造失败时的行为
|
已指明 |