【发布时间】:2013-02-11 19:38:09
【问题描述】:
直观地说,从 C++ 规范来看,在我看来,istream::putback( c ) 似乎应该总是安排输入缓冲区,以便下一次调用 istream::peek() 应该读取字符 c。这不正确吗?我之所以问是因为 Xcode 4.6 附带的最新版本的 libc++ 似乎并未在所有情况下都强制执行此行为——尤其是当最后一个字符位于 EOF 时。如果您使用unget() 而不是putback( c ),情况也是如此。
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;
}
【问题讨论】:
-
eofbit、failbit、badbit是否设置在putback(c)之后? (供参考:使用 libstdc++ 4.7,这些都没有设置,流是good()。) -
+1 两个答案。看起来像是在 r162608 中修复的 libc++ 中的错误。