istream eof несоответствие между libc ++ и libstdc ++

Следующая (игрушечная) программа возвращает разные вещи при компоновке с libstdc ++ и libc ++. Это ошибка в libc ++ или я не понимаю, как работает istream eof ()? Я пробовал запускать его с помощью g ++ на linux и mac os x и clang на mac os x, с -std = c ++ 0x и без него. У меня сложилось впечатление, что eof () не возвращает true до тех пор, пока попытка чтения (с помощью get () или что-то еще) действительно не удастся. Так ведет себя libstdc ++, но не так, как ведет себя libc ++.

#include <iostream>
#include <sstream>

int main() {
    std::stringstream s;

    s << "a";

    std::cout << "EOF? " << (s.eof() ? "T" : "F") << std::endl;
    std::cout << "get: " << s.get() << std::endl;
    std::cout << "EOF? " << (s.eof() ? "T" : "F") << std::endl;

return 0;
}

Thor:~$ g++ test.cpp
Thor:~$ ./a.out
EOF? F
get: 97
EOF? F
Thor:~$ clang++ -std=c++0x -stdlib=libstdc++ test.cpp 
Thor:~$ ./a.out
EOF? F
get: 97
EOF? F
Thor:~$ clang++ -std=c++0x -stdlib=libc++ test.cpp 
Thor:~$ ./a.out
EOF? F
get: 97
EOF? T
Thor:~$ clang++ -stdlib=libc++ test.cpp 
Thor:~$ ./a.out
EOF? F
get: 97
EOF? T
8
задан zaphoyd 25 January 2012 в 14:53
поделиться