Интуитивно, судя по спецификации С++, мне кажется, что istream::putback( c )
всегда должен упорядочивать входной буфер таким образом, чтобы следующий вызов istream::peek()
должен читать символ c
. Это неправильно? Я спрашиваю, потому что последняя версия libС++-доставки с Xcode 4.6, похоже, не обеспечивает такого поведения во всех случаях, особенно когда последний символ находится в EOF. То же самое верно, если вы используете unget()
вместо putback( c )
.
Правильно ли поведение libС++ или моя интуиция в том, как putback()/unget()
должен работать правильно?
Рассмотрим этот пример кода, который работает с libstdС++, но не с libС++ (утверждение терпит неудачу).
#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;
}