30 Input/output library [input.output]

30.7 Formatting and manipulators [iostream.format]

30.7.4 Input streams [input.streams]

30.7.4.1 Class template basic_­istream [istream]

30.7.4.1.3 Class basic_­istream​::​sentry [istream::sentry]

namespace std {
  template <class charT, class traits = char_traits<charT>>
  class basic_istream<charT, traits>::sentry {
    using traits_type = traits;
    bool ok_; // exposition only
  public:
    explicit sentry(basic_istream<charT, traits>& is, bool noskipws = false);
    ~sentry();
    explicit operator bool() const { return ok_; }
    sentry(const sentry&) = delete;
    sentry& operator=(const sentry&) = delete;
  };
}

Этот класс sentry определяет класс, который отвечает за выполнение безопасных в отношении исключений операций с префиксом и суффиксом.

explicit sentry(basic_istream<charT, traits>& is, bool noskipws = false);

Effects: Если is.good() есть false, звонит is.setstate(failbit). В противном случае готовится к форматированному или неформатированному вводу. Во-первых, если is.tie() это не нулевой указатель, функция вызывает is.tie()->flush() синхронизацию выходной последовательности с любым связанным внешним потоком C. За исключением того, что этот вызов может быть подавлен, если область размещения is.tie() пуста. Кроме того, реализации разрешается отложить вызов до flush тех пор, пока неis.rdbuf()->underflow() произойдет вызов . Если такой вызов не происходит до того, как sentry объект будет уничтожен, вызов flush может быть полностью исключен.305 Если noskipws равен нулю и is.flags() & ios_­base​::​skipws отличен от нуля, функция извлекает и отбрасывает каждый символ до тех пор, пока следующий доступный входной символ c является пробельным символом. Если is.rdbuf()->sbumpc() или is.rdbuf()->sgetc() возвращается traits​::​eof(), функция вызывает setstate(failbit | eofbit) (который может бросить ios_­base​::​failure).

Remarks: Конструктор

explicit sentry(basic_istream<charT, traits>& is, bool noskipws = false)

использует текущий встроенный языковой стандарт в is, чтобы определить, является ли следующий входной символ пробелом или нет.

Чтобы определить, является ли данный символ c пробельным символом, конструктор работает так, как если бы он выполнял следующий фрагмент кода:

const ctype<charT>& ctype = use_facet<ctype<charT>>(is.getloc());
if (ctype.is(ctype.space, c) != 0)
  // c is a whitespace character.

Если после любой препарат будет завершен, is.good() это true, вok_­ != false противном случае ok_­ == false. Во время подготовки конструктор может вызвать setstate(failbit) (который может throw ios_­base​::​​failure ([iostate.flags]))306

~sentry();

Effects: Никто.

explicit operator bool() const;

Effects: Возврат ok_­.

Это будет возможно только в функциях, которые являются частью библиотеки. Семантика конструктора, используемого в пользовательском коде, указана.

Конструктор и деструктор сторожа также могут выполнять дополнительные операции, зависящие от реализации.