std::basic_ostream<CharT,Traits>::sentry
class sentry; |
Объект класса basic_ostream::sentry создаётся в локальной области видимости в начале каждой функции-члена std::basic_ostream, выполняющей вывод (как форматированный, так и неформатированный). Его конструктор подготавливает поток вывода: проверяет, не находится ли поток уже в состоянии ошибки, сбрасывает связанные с ним потоки вывода и при необходимости выполняет другие действия, определяемые реализацией. Очистка, определяемая реализацией, а также сброс потока вывода при необходимости выполняются в деструкторе, что гарантирует их выполнение в случае возникновения исключений во время вывода.
Функции-члены
| создаёт объект sentry. Здесь выполняются все действия по подготовке (функция-член) |
|
| при необходимости завершает работу с объектом потока после форматированного вывода или после исключения (функция-член) |
|
|
operator= | оператор присваивания удалён (функция-член) |
| проверяет, успешно ли выполнена подготовка объекта потока (функция-член) |
std::basic_ostream::sentry::sentry
explicit sentry( std::basic_ostream<CharT, Traits>& os ); |
Подготавливает поток к форматированному выводу.
Если os.good() равно false, возвращает управление. В противном случае, если os.tie() не является нулевым указателем, вызывает os.tie()->flush() для синхронизации последовательности вывода с внешними потоками. Во время подготовки конструктор может вызвать setstate(failbit) (который может выбросить std::ios_base::failure).
Если после завершения подготовки os.good() == true, то все последующие вызовы operatorbool будут возвращать true.
Параметры
| os | - | поток вывода для подготовки |
Исключения
std::ios_base::failure при возникновении условия конца файла.
std::basic_ostream::sentry::~sentry
~sentry(); |
Если (os.flags() & std::ios_base::unitbuf) && !std::uncaught_exception() && os.good()) равно true, вызывает os.rdbuf()->pubsync(). Если эта функция возвращает -1, устанавливает badbit в os.rdstate(), не распространяя исключение.
std::basic_ostream::sentry::operator bool
explicit operator bool() const; |
Проверяет, успешно ли выполнена подготовка потока вывода.
Параметры
(нет)
Возвращаемое значение
true, если подготовка потока вывода прошла успешно, в противном случае — false.
Пример
#include <iostream>
#include <sstream>
struct Foo
{
char n[6];
};
std::ostream& operator<<(std::ostream& os, Foo& f)
{
std::ostream::sentry s(os);
if (s)
os.write(f.n, 5);
return os;
}
int main()
{
Foo f = {"abcde"};
std::cout << f << '\n';
}
Вывод:
abcde
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 397 | C++98 | деструктор мог вызывать os.flush(), который может выбрасывать исключения | исключение не распространяется |
| LWG 442 | C++98 | operatorbool не был объявлен с const (в обзоре он объявлен с const) | добавлен const |
| LWG 835 | C++98 | если os устанавливает unitbuf, деструктор вызывает os.flush(), котораяявляется функцией вывода без форматирования и создаёт другой объект sentry (деструктор которого затем создаёт ещё один объект sentry и так далее) | в этом случае вместо этого вызывается os.rdbuf()->pubsync() |
См. также
| вставляет форматированные данные (функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_ostream/sentry