Spec-Zone.ru › C++

std::basic_ostream<CharT,Traits>::sentry

class sentry;

Объект класса basic_ostream::sentry создаётся в локальной области видимости в начале каждой функции-члена std::basic_ostream, выполняющей вывод (как форматированный, так и неформатированный). Его конструктор подготавливает поток вывода: проверяет, не находится ли поток уже в состоянии ошибки, сбрасывает связанные с ним потоки вывода и при необходимости выполняет другие действия, определяемые реализацией. Очистка, определяемая реализацией, а также сброс потока вывода при необходимости выполняются в деструкторе, что гарантирует их выполнение в случае возникновения исключений во время вывода.

Функции-члены

(constructor)
создаёт объект sentry. Здесь выполняются все действия по подготовке
(функция-член)
(destructor)
при необходимости завершает работу с объектом потока после форматированного вывода или после исключения
(функция-член)
operator=
оператор присваивания удалён
(функция-член)
operator bool
проверяет, успешно ли выполнена подготовка объекта потока
(функция-член)

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()

См. также

operator<<
вставляет форматированные данные
(функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_ostream/sentry

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API