C++ 命名要求: UnformattedInputFunction
来自 cppreference.cn
[编辑] 要求
UnformattedInputFunction 是一个流输入函数,执行以下操作:
1) 构造一个类型为 basic_istream::sentry 的对象,该对象具有自动存储期,并且
noskipws
参数设置为 true,执行以下操作:- 如果输入流上设置了 eofbit 或 badbit,则同时设置 failbit;如果在此输入流的 异常掩码 中启用了
failbit
上的异常 ((exceptions() & failbit) != 0),则抛出 ios_base::failure。 - 如果适用,刷新 tie()'d 输出流。
2) 通过调用
sentry::operator bool()
检查岗哨的状态,这等效于 basic_ios::good。- 如果运算符返回 false 或岗哨的构造函数抛出异常
- 将输入流中提取的字符数 (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) 无论如何,无论是因异常终止还是返回,在离开此函数之前都会调用岗哨的析构函数。
[编辑] 标准库
以下标准库函数是 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 | 由于以下原因抛出异常是否会导致设置 badbit 尚不清楚:设置 eofbit 和/或 failbit 将导致设置 badbit |
从 basic_ios::clear 抛出的异常 未被捕获或重新抛出 |
LWG 160 | C++98 | 确定捕获的异常是否重新抛出的过程 提到了一个不存在的函数 exception() |
更正为 exceptions() |
LWG 243 | C++98 | 当 sentry::operator bool() 返回 false 时的行为或岗哨对象构造失败时的行为未指定 |
已指定 |