直观地说,从C++规范来看,它在我看来好像istream::putback(c)
应该总是安排输入缓冲区,以便下一个调用istream::peek()
应该读取字符c
。这是不正确的?我问,因为在所有情况下,使用Xcode 4.6的最新版本的libC++ shipping似乎不会强制执行此行为 - 特别是当最后一个字符位于EOF时。如果您使用unget()
而不是putback(c)
,情况也是如此。不应该istream :: peek()总是返回你刚刚putback()?
是libC++的行为是正确的,还是我的直觉如何putback()/unget()
应该工作正确?
考虑这个示例代码,该代码与libstdC++一起使用,但不与libC++一起使用(断言失败)。
#include <sstream>
#include <cassert>
int main(int argc, const char * argv[])
{
std::istringstream in("[Test]");
while(in)
{
int c = in.get();
if(c == ']')
{
in.putback(c);
assert(in.peek() == c); // Fails with libc++. Succeeds with libstdc++.
break;
}
}
return 0;
}
在'putback(c)'之后是否设置了'eofbit','failbit','badbit'? (仅供参考:使用libstdC++ 4.7,其中没有一个设置,流是'good()'。) – us2012 2013-02-11 20:48:08
+1。看起来像在r162608中修复的libC++中的错误。 – 2013-02-11 21:50:44