C++ named requirements: UnformattedInputFunction
From cppreference.net
要求
一个 UnformattedInputFunction 是执行以下操作的流输入函数:
1)
构造一个具有自动存储持续时间且
noskipws
参数设为
true
的
basic_istream::sentry
类型对象,该操作执行以下步骤:
-
若输入流中已设置
eofbit
或
badbit
,则同时设置
failbit
;若此输入流的
异常掩码
中已启用针对
failbit的异常( ( exceptions ( ) & failbit ) ! = 0 ),则抛出 ios_base::failure 。 - 若存在关联的输出流,则刷新该通过 tie() 绑定的输出流。
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 s 。
- 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
或哨兵对象构造失败时的行为未作规定 |
已明确规定 |