What value should `std::stringstream::fail()` return after r
What value should `std::stringstream::fail()` return after reading then writing? (gcc vs clang)
考虑以下代码段:
#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::stringstream
从std::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()== 0bool eof()const;
返回:如果在rdstate()中设置了eofbit。
eofbit
已在这种情况下设置了,然后 std::basic_ios::good
返回nonzero并导致写作失败(结果显示),则应设置failbit
。
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- C++函数中的精确"return"矩
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 方法错误"not all control paths return a value"和方法不返回值
- GLFW glfwCreateWindowSurface return -7
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- 如何解决类成员函数中的"return a value"错误?
- C++概念assignable_from不接受 const&-return 运算符=
- Malloc void return char 数组有时不起作用(Terry Davis 对 C++);
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 错误:调用 .. at return 语句时没有匹配函数
- 当你只使用 return 时,函数返回什么类型;在 c++ 中
- GLSL C++ glVertexAttribPointer & glDrawElements return GL_INVALID_OPERATION
- return ((fileatr & FILE_ATTRIBUTE_DIRECTORY) == 0);
- "Warning : No return statement in function returning non-void"是什么意思?
- 当出现错误ld return 1退出状态时,如何编译程序
- 使用flag、return、exception、goto或break中止过程
- 我一直收到错误"cannot convert 'float*' to 'float' in return"
- What value should `std::stringstream::fail()` return after r
- Segfault after the return 0;