Почему этот закрытый поток все еще "хорош" после того, как я пытаюсь извлечь из него?

В 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]? Или я неправильно истолковал стандарт?

2 ответа

Решение

Я только что понял, что я глупый

#include <iostream>
#include <fstream>

int main() {
   std::ifstream f;
   std::cout << f.get() << ", ";
   std::cout << f.good() << ", " << f.bad();
}

// Output: -1, 0, 0

Неуказанный порядок оценки. Duh.

Проблема в том, что порядок вызова операций над f не указан стандартом. Компилятор может свободно звонить f.good(), f.bad(), а также f.get() в любом порядке он выбирает.

Попробуйте изменить, чтобы напечатать его на отдельных строках.

Другие вопросы по тегам