直观地说,从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;
}