凭直觉,从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?)。

10-08 13:18