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()в этом случае вместо |
См. также
| вставляет форматированные данные (публичная функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_ostream/sentry