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

Is std::istringstream::peek() supposed to set the eof flag?

提问人:Krzysiek Karbowiak 提问时间:10/19/2023 更新时间:10/19/2023 访问量:56

问:

请考虑以下代码:

#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 文章没有提到修改标志。它提到了由以下方式修改的标志:cppreferencepeekget

就标准而言,这种行为是否正确?

C++ C++20 字符串流 ISrStringStream

评论

3赞 Igor Tandetnik 10/19/2023
peek“行为为 UnformattedInputFunction”。如果点击该链接,您将看到 UnformattedInputFunction 具有设置的副作用eofbit
0赞 Krzysiek Karbowiak 10/19/2023
是的,我错过了这个细节。谢谢!

答:

4赞 Yksisarvinen 10/19/2023 #1

是的,这是 UnformattedInputFunction 的要求。

一、窥视的描述(强调我的):

效果:表现为未格式化的输入函数(如上所述)。 构造哨兵对象后,读取但不提取当前输入字符。
返回: if is . 否则,返回 rdbuf()->sgetc()。
traits​::​eof()good()false

然后,从上面对 UnformattedInputFunction 的描述(强调我的):

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