Espacios de nombres
Variantes

Expresiones lambda (desde C++11)

De cppreference.com

Construye un cierre o clausura: un objeto función no denominado capaz de capturar variables en ámbito.

Sintaxis

[ capturas ] <tparams>(opcional)
(C++20)
( params ) especificadores-lambda { cuerpo }
(1)
[ capturas ] ( params ) tipo-de-retorno-al-final { cuerpo } (2)
[ capturas ] ( params ) { cuerpo } (3)
[ capturas ] especificadores-lambda(opcional)
(C++23)
{ cuerpo }
(4)
1) Declaración completa.
2) Declaración de una lambda const: los objetos capturados por copia son const en el cuerpo de la lambda.
3) Tipo de retorno al final omitido: el tipo de retorno del operador de llamada a función, operator(), del cierre es deducido a partir de las instrucciones return como si lo fuera para una función cuyo tipo de retorno se declarara auto.
4) Lista de parámetros omitida: la función no toma argumentos, como si la lista de parámetros fuera (). Este formato solamente puede usarse si no se utiliza ni constexpr, ni consteval, ni mutable, ni una especificación de excepción ni un tipo de retorno al final. (hasta C++23)

Explicación

capturas - Una lista separada por comas de cero o más capturas, opcionalmente comenzando con una captura-por-defecto.

Véase más abajo para una descripción detallada de las capturas.

Una expresión lambda puede usar una variable sin capturarla si la variable

Una expresión lambda puede leer el valor de una variable sin capturarla si la variable

  • tiene un tipo entero const, no volátil, o un tipo enumeración, y se ha inicializado con una expresión constante, o
  • es constexpr y no tiene miembros mutables.
<tparams>(C++20) - Una lista de parámetros de plantilla (entre corchetes angulares), utilizada para proporcionar nombres a los parámetros de plantilla de una lambda genérica (véase TipoCierre::operator() más abajo). Al igual que en una declaración de plantilla, la lista de parámetros de plantilla puede estar seguida por una cláusula-requires opcional, que especifica las restricciones de los parámetros de plantilla. Si se proporciona, la lista de parámetros de plantilla no puede estar vacía (no se permite <>).
params - La lista de parámetros, como en las funciones con nombre. Si se usa auto como el tipo de un parámetro, la lambda es una lambda genérica. (desde C++14)
especificadores-lambda - Consiste en specifiers, excepción, atributos, tipo-de-retorno-al-final, y requires(C++20) en ese orden; cada componente es opcional.
especificadores - Secuencia opcional de especificadores. Se permiten los siguientes especificadores:
  • mutable: Permite al cuerpo modificar los objetos capturados por copia, y llamar a sus funciones miembros no const.
  • constexpr: Especifica explícitamente que el operador de llamada a función es una función constexpr. Cuando este especificador no está presente, el operador de llamada a función de todos modos será constexpr si llega a satisfacer todos los requisitos de una función constexpr
(desde C++17)
  • consteval: Especifica que el operador de llamada a función es una función inmediata. consteval y constexpr no pueden usarse al mismo tiempo.
(desde C++20)
excepción - Proporciona la especificación de excepción dinámica o el especificador noexcept para operator() del tipo cierre.
atributos - Proporciona la especificación de atributos para el tipo del operador de llamada a función del tipo cierre. Cualquier atributo así especificado pertenece al tipo del operador de llamada a función, no al operador de llamada a función en sí (por ejemplo, el atributo [[noreturn]] no se puede utilizar).
tipo-de-retorno-al-final - -> ret, donde ret especifica el tipo de retorno. Si el tipo-de-retorno-al-final no está presente, el tipo de retorno se implica de las instrucciones return de la función (o void si no devuelve ningún valor).
requires(C++20) - Agrega una restricción al operador de llamada a función, operator(), del tipo cierre.
cuerpo - Cuerpo de la función.

La expresión lambda es una expresión pr-valor de un tipo clase único sin nombre, que no es ni una unión ni un agregado, conocido como "tipo cierre", que se declara (a los efectos de ADL) en el ámbito de bloque más pequeño, ámbito de clase o ámbito de espacio de nombres que contiene la expresión lambda. El tipo cierre tiene los siguientes miembros:

TipoCierre::operator()(params)

<tbody> </tbody>
ret operator()(params) const { cuerpo