Namespaces
Variants

std::experimental::ranges:: Invocable, std::experimental::ranges:: RegularInvocable

From cppreference.net
Определено в заголовочном файле <experimental/ranges/concepts>
template < class F, class ... Args >

concept bool Invocable =
requires ( F && f, Args && ... args ) {
ranges:: invoke ( std:: forward < F > ( f ) , std:: forward < Args > ( args ) ... ) ;
/* не требуется сохранять равенство */

} ;
(ranges TS)
template < class F, class ... Args >
concept bool RegularInvocable = Invocable < F, Args... > ;
(ranges TS)

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

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

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

Выражение называется сохраняющим равенство если оно даёт равные результаты при равных входных данных.

  • Входные данные выражения состоят из его операндов.
  • Выходные данные выражения состоят из его результата и всех операндов, измененных выражением (если таковые имеются).

Каждое выражение, которое должно сохранять равенство, дополнительно должно быть стабильным : два вычисления такого выражения с одинаковыми входными объектами должны давать равные результаты при отсутствии каких-либо явных изменений этих входных объектов между вычислениями.

Если не указано иное, каждое выражение, используемое в requires-expression , должно быть сохраняющим равенство и стабильным, и вычисление выражения может изменять только свои неконстантные операнды. Операнды, являющиеся константными, не должны изменяться.

Примечания

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

Генератор случайных чисел может удовлетворять требованиям Invocable , но не может удовлетворять требованиям RegularInvocable (за исключением комических примеров ).