Namespaces
Variants

std::basic_ios<CharT,Traits>:: operator bool

From cppreference.net
operator /* unspecified-boolean-type */ ( ) const ;
(1) (до C++11)
explicit operator bool ( ) const ;
(2) (начиная с C++11)

Проверяет, нет ли ошибок в потоке.

1) Возвращает значение, которое вычисляется как false в булевом контексте, если fail ( ) возвращает true , в противном случае возвращает значение, которое вычисляется как true в булевом контексте.
2) Возвращает true если поток не имеет ошибок и готов к операциям ввода-вывода. Конкретно возвращает ! fail ( ) .

Этот оператор позволяет использовать потоки и функции, возвращающие ссылки на потоки, в качестве условий циклов, что приводит к идиоматическим циклам ввода на C++, таким как while ( stream >> value ) { ... } или while ( std:: getline ( stream, string ) ) { ... } . Такие циклы выполняют тело цикла только в случае успешной операции ввода.

Содержание

Параметры

(нет)

Возвращаемое значение

1) Значение, которое вычисляется в true в булевом контексте, если поток не имеет ошибок, и значение, которое вычисляется в false в булевом контексте в противном случае.
2) true если поток не имеет ошибок, false в противном случае.

Примечания

Это преобразование может использоваться в контекстах, где ожидается bool (например, в условии if ). Однако неявные преобразования (например, в int ), которые могут происходить с bool , не допускаются.

В C++98, operator bool не мог быть предоставлен напрямую из-за проблемы безопасного bool . Исходное решение в C++98 — предоставление operator void * , который возвращает нулевой указатель, если fail ( ) возвращает true , или ненулевой указатель в противном случае. Это было заменено решением LWG issue 468 , которое позволяет применять Safe Bool idiom .

Начиная с C++11, функции преобразования могут быть explicit . Решение LWG issue 1094 ввело явный operator bool , и булево преобразование теперь безопасно.

Пример

#include <iostream>
#include <sstream>
int main()
{
    std::istringstream s("1 2 3 error");
    int n;
    std::cout << std::boolalpha << "s is " << static_cast<bool>(s) << '\n';
    while (s >> n)
        std::cout << n << '\n';
    std::cout << "s is " << static_cast<bool>(s) << '\n';
}

Вывод:

s is true
1
2
3
s is false

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 468 C++98 operator void * был предоставлен вместо этого предоставляется функция преобразования в неспецифицированный булев тип

Смотрите также

Следующая таблица показывает значения basic_ios аксессоров ( good() , fail() и др.) для всех возможных комбинаций ios_base::iostate флагов:

**Примечание:** В данном HTML-фрагменте весь текст находится внутри тегов ` `, ` ` или является C++ специфическими терминами (названиями флагов и операторов), которые согласно инструкциям не подлежат переводу. Поэтому исходный текст оставлен без изменений.
ios_base::iostate флаги basic_ios аксессоры
eofbit failbit badbit good() fail() bad() eof() operator bool operator!
ложь ложь ложь истина ложь ложь ложь истина ложь
ложь ложь истина ложь истина истина ложь ложь истина
ложь истина ложь ложь истина ложь ложь ложь истина
ложь истина истина ложь истина истина ложь ложь истина
истина ложь ложь ложь ложь ложь истина истина ложь
истина ложь истина ложь истина истина истина ложь истина
истина истина ложь ложь истина ложь истина ложь истина
истина истина истина ложь истина истина истина ложь истина