直感的には、C ++の仕様から判断すると、次の呼び出しで文字を読み取るistream::putback( c )
ように、常に入力バッファーを配置する必要があるように見えます。これは正しくありませんか?Xcode4.6に同梱されている最新バージョンのlibc++は、すべての場合、特に最後の文字がEOFにある場合に、この動作を強制するわけではないようです。の代わりにを使用する場合も同様です。istream::peek()
c
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;
}