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 оператор 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