В GCC 4.7.0 20111217, GCC 4.1.2 , GCC 4.3.4 и GCC 4.5.1 :
#include <iostream>
#include <fstream>
int main() {
std::ifstream f;
std::cout << f.get() << ", " << f.good() << ", " << f.bad();
}
// Output: -1, 1, 0
Я бы ожидал -1, 0, 1
(что дает мне Clang 3.1) из-за этих параграфов:
[C++11: 27.7.2.3]:
int_type get();
4 Эффекты: Ведет себя как неотформатированная функция ввода (как описано в пункте 27.7.2.3, параграф 1). После создания сторожевого объекта извлекает символ c
, если он доступен. В противном случае функция вызывает setstate(failbit)
, что может вызвать ios_base::failure
(27.5.5.4),
5 Возвращает: c
, если доступно, в противном случае traits::eof()
.
и
[C++11: 27.9.1.1/3]:
В частности:
- Если файл не открыт для чтения, последовательность ввода не может быть прочитана.
- Если файл не открыт для записи, последовательность вывода не может быть записана.
- Совместное положение файла поддерживается как для входной, так и для выходной последовательности.
GCC не в порядке здесь? Неужели исполнитель неверно истолковал «иначе» в [C++11: 27.7.2.3/4]
? Или я неправильно истолковал стандарт?