请考虑以下代码:
#include <iostream>
#include <sstream>
void print_flags(std::istringstream & iss)
{
std::cout << "good: " << iss.good() << ", eof: " << iss.eof() << ", fail: " << iss.fail() << ", bad: " << iss.bad() << "\n";
}
int main()
{
std::istringstream iss("A");
char chr;
iss >> chr;
print_flags(iss);
iss.peek();
print_flags(iss);
}
在g和clang上,我都看到了以下输出:
good: 1, eof: 0, fail: 0, bad: 0
good: 0, eof: 1, fail: 0, bad: 0
cppreference文章没有提到peek
修改标志。它提到了get
修改的标志:cppreference。
这种行为是否符合标准?
1条答案
按热度按时间wj8zmpe11#
是的,这是对 UnformattedInputFunction 的要求。
首先,
peek
的描述(重点是我的):效果:表现为无格式输入函数(如上所述)。构造哨兵对象后,读取但不提取当前输入字符。
返回:
traits::eof()
,如果good()
是false
。否则,返回rdbuf()->sgetc()
。然后,根据上面对 UnformattedInputFunction 的描述(强调我的):
[...]如果
rdbuf()->sbumpc()
或**rdbuf()->sgetc()
返回traits::eof()
,则ios_base::eofbit
被设置为**本地错误状态,输入函数停止尝试获取请求的输入。[...]