Namespaces
Variants

C++ named requirements: BooleanTestable

From cppreference.net
C++ named requirements

Указывает, что выражение такого типа и категории значения преобразуемо в 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 ) ) моделирует boolean-testable .

(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)
определяет, что тип может использоваться в булевых контекстах
( концепт только для демонстрации* )