std::istringstream::peek() 应该设置 eof 标志吗?

问题描述 投票:0回答:1

考虑以下代码:

#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

这种行为符合标准吗?

c++ c++20 stringstream istringstream
1个回答
1
投票

是的,这是对 UnformattedInputFunction 的要求。

首先,

peek
的描述(强调我的):

效果:表现为未格式化的输入函数(如上所述)。 构造哨兵对象后,读取但不提取当前输入字符。
返回:如果

traits​::​eof()
good()
,则返回
false
。 否则,返回
rdbuf()->sgetc()

然后,根据上面UnformattedInputFunction的描述(强调我的):

[...] 如果

rdbuf()->sbumpc()
rdbuf()->sgetc()
返回
traits​::​eof()
,则
ios_base​::​eofbit
被设置为本地错误状态,并且输入函数停止尝试获取请求的输入。 [...]

© www.soinside.com 2019 - 2024. All rights reserved.