考虑以下代码:
#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。
这种行为符合标准吗?
是的,这是对 UnformattedInputFunction 的要求。
peek
的描述(强调我的):
效果:表现为未格式化的输入函数(如上所述)。 构造哨兵对象后,读取但不提取当前输入字符。
返回:如果是traits::eof()
,则返回good()
。 否则,返回false
。rdbuf()->sgetc()
然后,根据上面UnformattedInputFunction的描述(强调我的):
[...] 如果
或rdbuf()->sbumpc()
返回rdbuf()->sgetc()
,则traits::eof()
被设置为本地错误状态,并且输入函数停止尝试获取请求的输入。 [...]ios_base::eofbit