不应该istream :: peek()总是返回你刚刚putback()?

Old*_*ier 11 c++ istream libc++

直观地说,从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;
}
Run Code Online (Sandbox Code Playgroud)

Bo *_*son 6

实际上putbackC++ 11中的函数已经发生了变化:

§27.7.2.3/ 34

basic_istream<charT,traits>& putback(char_type c);

效果:表现为无格式输入函数(如27.7.2.3,第1段所述),但函数首先清除eofbit....

哪个句子的后半部分在C++ 03中不存在.

因此,它可能取决于编译器是否已完全实现此更改,或者您是否使用了所需的选项(-std=C++11?).