Namespaces
Variants

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

From cppreference.net
Definido en el encabezado <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 ) ... ) ;
/* no se requiere que preserve la igualdad */

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

El concepto Invocable especifica que un tipo invocable F puede ser llamado con un conjunto de tipos de argumentos Args... utilizando la plantilla de función ranges::invoke .

El concepto RegularInvocable añade al concepto Invocable el requisito de que la expresión invoke sea de preservación de igualdad y no modifique ni el objeto función ni los argumentos.

Preservación de la igualdad

Una expresión es equality preserving si produce salidas iguales dadas entradas iguales.

  • Las entradas de una expresión consisten en sus operandos.
  • Las salidas de una expresión consisten en su resultado y todos los operandos modificados por la expresión (si los hay).

Toda expresión que deba preservar la igualdad debe además ser estable : dos evaluaciones de dicha expresión con los mismos objetos de entrada deben producir salidas iguales, a menos que exista una modificación explícita e intermedia de esos objetos de entrada.

A menos que se indique lo contrario, cada expresión utilizada en una requires-expression debe ser de preservación de igualdad y estable, y la evaluación de la expresión solo puede modificar sus operandos no constantes. Los operandos que son constantes no deben modificarse.

Notas

La distinción entre Invocable y RegularInvocable es puramente semántica.

Un generador de números aleatorios puede satisfacer Invocable pero no puede satisfacer RegularInvocable (excluyendo los cómicos ejemplos ).