Скажем, у меня есть класс с двумя членами данных:Ожидаемое поведение при неудачном чтении пользовательского типа из IStream
class X {
std::string a;
int b;
public:
ostream& print(ostream& os);
istream& read(istream& is);
}
print
функция выводит все данные в удобном формате, например:
ostream& X::print(ostream& os) {
return os << a << ' ' << b;
}
Теперь функция read
должна делать обратную: прочитайте что-то в указанном формате (скажем, как horse 54
, который затем приведет к a = "horse"
и b = 54
).
Так сказать, вход не соответствует этому формату. Моя интуиция говорит, что как только мы сталкиваемся с неожиданным характером (например, при попытке прочитать int
), мы устанавливаем failbit
и помещают каждый символ, который мы читаем до сих пор обратно в поток. Каково ожидаемое поведение функции read
(или operator>>
) в этом случае? Как работает стандартная библиотека? Должна ли нам потребоваться отменить все изъятие символов, если сбой чтения?
Читая документы для [уничтожать в зародыше] (http://en.cppreference.com/w/cpp/io/basic_istream/unget), похоже, будет уничтожать в зародыше конкретно не в состоянии, когда ничего, кроме 'goodbit' установлен (и, возможно, даже [throw] (http://en.cppreference.com/w/cpp/io/basic_ios/exceptions). Поэтому я думаю, что если вам нужно обрабатывать плохое форматирование в 'operator >>', вы обычно хотите используйте исключение. – Jason