Именованные требования C++: BooleanTestable
Указывает, что выражение с таким типом и категорией значения преобразуется в bool, а логические операторы для этого типа или двух различных типов BooleanTestable ведут себя обычным образом (включая вычисление с коротким замыканием).
Требования
Пусть e — выражение определённого типа и категории значения. Тип и категория значения соответствуют требованиям BooleanTestable, если:
-
!eявляется корректным выражением и не изменяет объект, обозначенныйe, если таковой имеется, за исключением случая, когдаeявляется xvalue: тогда обозначенный объект может остаться в допустимом, но неуточнённом состоянии(начиная с C++11). - И
e, и!eпреобразуются в bool посредством как неявного преобразования, так иstatic_cast. - Преобразования обоими способами дают одинаковые результаты и не изменяют исходный объект, если таковой имеется, за исключением случая, когда
eили!eявляется xvalue: тогда исходный объект может остаться в допустимом, но неуточнённом состоянии(начиная с C++11). -
выполняется
bool(!e) == !bool(e). - Для типа
eили!eпосредством поиска, зависящего от аргументов, не виден ни один подходящий нестатический оператор operator&& или operator||. - Если
eили!eимеет тип класса, класс не определяет ни один оператор-член operator&& или operator||.
Примечания
Стандарт не определяет именованное требование с таким названием. Изначально оно было предложено в раннем варианте разрешения LWG2114, но в окончательном варианте разрешения P2167R3 было заменено концептом boolean-testable, предназначенным только для описания. Поскольку реализации обычно ожидают, что предоставленные типы будут соответствовать boolean-testable даже в режимах до C++20, мы намеренно рассматриваем P2167R3 как отчёт об обнаруженной ошибке и преобразуем boolean-testable в устаревшие именованные требования.
Когда операторы && и || используются с операндами, тип и категория значения которых соответствуют требованиям BooleanTestable, выбираются встроенные версии операторов и выполняется вычисление с коротким замыканием.
| Тип и категория значения выражения | (начиная с C++20) |
К типам BooleanTestable (с любой категорией значения) относятся bool, std::true_type(начиная с C++11), std::bitset<N>::reference и int*.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
|
LWG 2114 (P2167R3) | C++98 | Требование преобразуемости в bool было недостаточно строгим, чтобы отражать ожидания реализаций | Требования усилены |
См. также
|
(C++20) | указывает, что тип можно использовать в булевых контекстах (концепт, предназначенный только для описания*) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/BooleanTestable