What value should `std::stringstream::fail()` return after r

What value should `std::stringstream::fail()` return after reading then writing? (gcc vs clang)

本文关键字:return after stringstream value should std What fail      更新时间:2023-10-16

考虑以下代码段:

#include <iostream>
#include <sstream>
int main()
{
    std::stringstream ss;
    ss << "12345";
    unsigned short s;
    ss >> s;
    ss << "foo";
    std::cout << std::boolalpha
              << "nss.eof()  = " << ss.eof()
              << "nss.good() = " << ss.good()
              << "nss.bad()  = " << ss.bad()
              << "nss.fail() = " << ss.fail()
              << "nss.str()  = " << ss.str();
}

clang 中继打印以下结果:

ss.eof()  = true
ss.good() = false
ss.bad()  = false
ss.fail() = false
ss.str()  = 12345

在wandbox上


g 中继打印以下结果:

ss.eof()  = true
ss.good() = false
ss.bad()  = false
ss.fail() = true
ss.str()  = 12345

在wandbox上


您可以看到,两个编译器之间的ss.fail()值不同。在这种情况下,标准对std::stringstream的行为有何评论?在写入已经消耗的流时,是否将实现定义为设置failbit/badbit

gcc是正确的。std::stringstreamstd::basic_ostream继承,并根据operator<<(std::basic_ostream)的行为(从ss << "foo";调用),

效果:

和§30.7.5.2.1/1共同要求[ostream.formatted.reqmts]:

(强调我的)

每个格式的输出功能通过构造类Sentry的对象开始执行。如果此对象在转换为类型bool的值时返回true,则该功能努力生成所请求的输出。如果一代失败,则格式化的输出函数确实会setState(ios_base :: failebit),它可能会抛出异常。

和§30.7.5.1.3类BASIC_OSTREAM :: SENTRY [OSTREAM :: SENTRY]:

如果os.good()为非零,则准备格式化或未格式化的输出。 如果OS.TIE()不是零指针,请调用OS.TIE() -> flush()。

如果完成准备后,os.good()为true,ok_ == 是的,否则,ok_ == false。在准备过程中,构造函数可能 调用setState(failbit)(可能会抛出ios_base ::失败 ([iostate.flags]))

和§30.5.5.4basic_ios flags函数[iostate.flags]:

iOstate rdstate()const;
返回:流缓冲区的错误状态。

bool good()const;
返回:rdstate()== 0

bool eof()const;
返回:如果在rdstate()中设置了eofbit。

eofbit已在这种情况下设置了,然后 std::basic_ios::good返回nonzero并导致写作失败(结果显示),则应设置failbit