Namespaces
Variants

std:: invocable, std:: regular_invocable

From cppreference.net
Определено в заголовке <concepts>
template < class F, class ... Args >

concept invocable =
requires ( F && f, Args && ... args ) {
std:: invoke ( std:: forward < F > ( f ) , std:: forward < Args > ( args ) ... ) ;
/* не требуется быть сохраняющим равенство */

} ;
(начиная с C++20)
template < class F, class ... Args >
concept regular_invocable = std :: invocable < F, Args... > ;
(начиная с C++20)

Концепт invocable определяет, что вызываемый тип F может быть вызван с набором аргументов Args... с использованием шаблона функции std::invoke .

Концепт regular_invocable расширяет концепт invocable , требуя, чтобы выражение invoke было сохраняющим равенство и не модифицировало ни объект функции, ни аргументы.

Содержание

Сохранение равенства

Выражения, объявленные в requires выражениях концепций стандартной библиотеки, должны быть equality-preserving (если не указано иное).

Примечания

Различие между invocable и regular_invocable является чисто семантическим.

Генератор случайных чисел может удовлетворять invocable , но не может удовлетворять regular_invocable ( комические исключены ).

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
  • 18.7.2 Концепт invocable [concept.invocable]
  • 18.7.3 Концепт regular_invocable [concept.regularinvocable]
  • Стандарт C++20 (ISO/IEC 14882:2020):
  • 18.7.2 Концепт invocable [concept.invocable]
  • 18.7.3 Концепт regular_invocable [concept.regularinvocable]

Смотрите также

проверяет, может ли тип быть вызван (как если бы с помощью std::invoke ) с заданными типами аргументов
(шаблон класса)

Внешние ссылки

Шуточный пример генератора случайных чисел , который удовлетворяет как invocable , так и regular_invocable .