std::basic_ios<CharT,Traits>::operator bool
operator /* unspecified-boolean-type */() const; | (1) | (до C++11) |
explicit operator bool() const; | (2) | (начиная с C++11) |
Проверяет, не содержит ли поток ошибок.
false, если fail() возвращает true, в противном случае возвращает значение, которое в контексте логического выражения вычисляется как true.true, если поток не содержит ошибок и готов к операциям ввода-вывода. В частности, возвращает !fail(). Этот оператор позволяет использовать потоки и функции, возвращающие ссылки на потоки, в качестве условий цикла, что приводит к идиоматическим циклам ввода в C++, таким как while (stream >> value) {...} или while (std::getline(stream, string)) {...}. Тело таких циклов выполняется только в том случае, если операция ввода завершилась успешно.
Параметры
(нет)
Возвращаемое значение
true, если поток не содержит ошибок, и значение, которое в контексте логического выражения вычисляется как false, в противном случае.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