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

Начиная с C++11 функции преобразования могут быть explicit. В результате рассмотрения обращения LWG 1094 был введён явный operatorbool, и теперь логическое преобразование безопасно.

Пример

#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 operatorvoid* предоставлялся вместо этого предоставляется функция преобразования в неуказанный логический тип

См. также

В следующей таблице показаны значения аксессоров 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/cpp/io/basic_ios/operator_bool

Spec-Zone.ru

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