凭直觉,从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;
}
最佳答案
实际上,C++ 11中的putback
函数发生了变化:
§27.7.2.3/34
句子的后半部分在C++ 03中不存在。
因此,这可能取决于编译器是否已完全实现此更改,或者是否使用必需的选项(-std=C++11
?)。