Spec-Zone.ru › C++

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

class sentry;

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

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

(конструктор)
создаёт объект sentry. Все подготовительные задачи выполняются здесь
(публичная функция-член)
(деструктор)
завершает работу объекта потока после форматированного вывода или при возникновении исключения, если необходимо
(публичная функция-член)
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, то любые последующие вызовы оператора bool вернут 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++.

DR Применено к Поведение, как опубликовано Корректное поведение
LWG 397 C++98 деструктор может вызвать os.flush(), который может бросить исключения исключение не распространяется
LWG 442 C++98 оператор bool не объявлен const (он const в сводке) добавлено const
LWG 835 C++98 если os устанавливает unitbuf, деструктор вызовет os.flush(), который
является UnformattedOutputFunction и создаёт другой объект sentry
(чей деструктор затем создаёт ещё один объект sentry и так далее)
вызывается
os.rdbuf()->pubsync()
в этом случае вместо

См. также

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

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

Spec-Zone.ru

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