Spec-Zone.ru › C++

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

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 оператор bool не мог быть предоставлен напрямую из-за проблемы безопасного булева типа. Первоначальное решение в C++98 заключалось в предоставлении оператора void*, который возвращает нулевой указатель, если fail() возвращает true, или ненулевой указатель в противном случае. Оно было заменено решением LWG issue 468, которое позволяет применить идиому Safe Bool.

С C++11 функции преобразования могут быть explicit. Решение LWG issue 1094 ввело явный оператор 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 был предоставлен оператор void* вместо этого предоставляется функция преобразования к неопределенному булевому типу

См. также

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

ios_base::iostate флаги Доступ к методам basic_ios
eofbit failbit badbit good() fail() bad() eof() operator bool operator!
false false false true false false false true false
false false true false true true false false true
false true false false true false false false true
false true true false true true false false true
true false false false false false true true false
true false true false true true true false true
true true false false true false true false true
true true true false true true true false true

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

Spec-Zone.ru

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