Espacios de nombres
Variantes
Acciones

std::invocable, std::regular_invocable

De cppreference.com
< cpp‎ | concepts
Definido en el archivo de encabezado <concepts>
template< class F, class... Args >

concept invocable =
  requires(F&& f, Args&&... args) {
    std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
      /* no se requiere que conserve la igualdad */

  };
(desde C++20)
template< class F, class... Args >
concept regular_invocable = std::invocable<F, Args...>;
(desde C++20)

El concepto invocable especifica un tipo invocable F que puede llamarse con un conjunto de argumentos Args... usando la plantilla de función std::invoke.

El concepto regular_invocable añade al concepto invocable requiriendo que la expresión invoke conserve la igualdad y no modifique ni el objeto función ni los argumentos.

[editar] Conservación de la igualdad

Una expresión es conservadora de igualdad si resulta en 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 es que los hay).

Cada expresión que se requiere sea conservadora de igualdad, se requiere además que sea estable: dos evaluaciones de tal expresión con los mismos objetos de entrada debe tener salidas iguales si no se encuentra alguna modificación interventora de esos objetos de entrada.

A menos que se indique de otra manera, cada expresión utilizada en una expresión-requiere se requiere sea conservadora de igualdad y estable, y la evaluación de la expresión puede solamente modificar sus operandos no constantes. Los operandos que son constantes no deben ser modificados.

[editar] Notas

La distinción entre invocable y regular_invocable es puramente semántica.

Un generador de números aleatorios puede satisfacer a invocable pero no puede satisfacer a regular_invocable (excluidas las tiras cómicas).