C++ named requirements: BooleanTestable
Указывает, что выражение такого типа и категории значения преобразуемо в bool , и для которого логические операторы данного типа или двух различных BooleanTestable типов обладают стандартным поведением (включая сокращённое вычисление ).
Содержание |
Требования
Пусть e будет выражением определённого типа и категории значения. Тип и категория значения удовлетворяют BooleanTestable требованиям, если:
- ! e является корректным выражением и не модифицирует объект, обозначенный e , если таковой имеется , за исключением случая, когда e является xvalue, тогда обозначенный объект может быть оставлен в допустимом, но неопределённом состоянии (since C++11) .
- Как e , так и ! e могут быть преобразованы в bool как с помощью неявного преобразования , так и с помощью static_cast .
- Оба способа преобразования дают равные результаты и не модифицируют исходный объект, если таковой имеется , за исключением случая, когда e или ! e является xvalue, тогда исходный объект может быть оставлен в допустимом, но неопределённом состоянии (since C++11) .
- bool ( ! e ) == ! bool ( e ) выполняется.
- Никакие доступные нечленные operator && и operator || не видны через поиск, зависимый от аргументов для типа e или ! e .
- Если e или ! e имеет классовый тип, класс не определяет никакие членные operator && или operator || .
Примечания
Стандарт не определяет именованное требование с таким названием. Изначально оно было предложено в раннем решении
LWG2114
, но было заменено исключительно экспозиционным концептом
boolean-testable
в финальном решении
P2167R3
. Поскольку реализации обычно ожидают, что предоставленные типы моделируют
boolean-testable
даже в режимах до C++20, мы намеренно рассматриваем P2167R3 как отчёт о дефекте и преобразуем
boolean-testable
в устаревшее именованное требование.
Когда операторы
&&
и
||
используются с операндами, тип и категория значения которых являются
BooleanTestable
, выбираются встроенные версии и выполняется сокращённое вычисление.
|
Тип и категория значения выражения
e
удовлетворяют требованиям
BooleanTestable
тогда и только тогда, когда
decltype
(
(
e
)
)
моделирует
|
(since C++20) |
Примеры типов, удовлетворяющих требованиям BooleanTestable (с любой категорией значения), включают bool , std::true_type (начиная с C++11) , std:: bitset < N > :: reference , и int * .
Отчёты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
|
LWG 2114
( P2167R3 ) |
C++98 | convertibility to bool was too weak to reflect the expectation of implementations | requirements strengthened |
Смотрите также
|
(C++20)
|
определяет, что тип может использоваться в булевых контекстах
( концепт только для демонстрации* ) |