Spec-Zone.ru › C++

Именованные требования 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, выбираются встроенные версии операторов и выполняется вычисление с коротким замыканием.

Тип и категория значения выражения e соответствуют требованиям BooleanTestable тогда и только тогда, когда decltype((e)) моделирует boolean-testable.

(начиная с C++20)

К типам BooleanTestable (с любой категорией значения) относятся bool, std::true_type(начиная с C++11), std::bitset<N>::reference и int*.

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 2114
(P2167R3)
C++98 Требование преобразуемости в bool было недостаточно строгим, чтобы отражать ожидания реализаций Требования усилены

См. также

boolean-testable
(C++20)
указывает, что тип можно использовать в булевых контекстах
(концепт, предназначенный только для описания*)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/BooleanTestable

Spec-Zone.ru

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