从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;
}
putback(c)
之后,eofbit
、failbit
和badbit
中是否有任何一个被设置?(参考:使用libstdc++ 4.7时,这些标志都没有被设置,流是good()
的。) - us2012