c ++ 14 introdujo lambdas genéricas que hicieron posible escribir lo siguiente:
auto func = [](auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Está muy claro que esta lambda genérica func
funciona como lo func
haría una función con plantilla .
¿Por qué el comité de C ++ decidió agregar una sintaxis de plantilla para lamda genérico?
c++
c++14
c++20
generic-lambda
codificador3101
fuente
fuente
Respuestas:
Las lambdas genéricas de C ++ 14 son una forma genial de generar un functor con un
operator ()
aspecto similar a este:Pero no así:
Ni así:
Ni de esta manera (aunque esto se vuelve un poco complicado de usar):
Las lambdas de C ++ 14 están bien, pero C ++ 20 nos permite implementar estos casos sin problemas.
fuente
(auto a, decltype(a) b)
en C ++ 14.b
no se deduce, y su argumento se convertirá implícitamente al tipo de en sua
lugar.Dado que puede usar lambdas con plantilla en C ++ 20, puede restringir sus tipos de una manera más fácil que una expresión SFINAE:
Esta lambda funcionará solo con tipos de vector.
fuente
consteval
relaciona con la nueva sintaxis? Es genial y todo, pero no entiendo la relevancia.La propuesta que fue aceptada en C ++ 20 tiene una sección de motivación extensa, con ejemplos. La premisa es esta:
A continuación hay bastantes ejemplos.
fuente
(fuente: iteración en tiempo de compilación con C ++ 20 lambdas )
Otra cosa interesante que se puede hacer tanto en C ++ 14 como en C ++ 17 genéricas lambdas es llamar directamente
operator()
pasando explícitamente un parámetro de plantilla:C ++ 14:
C ++ 20:
El ejemplo de C ++ 14 anterior es bastante inútil: no hay forma de hacer referencia al tipo proporcionado
operator()
en el cuerpo de la lambda sin darle un nombre al argumento y usardecltype
. Además, nos vemos obligados a pasar un argumento aunque no lo necesitemos.El ejemplo de C ++ 20 muestra cómo se puede acceder fácilmente a T en el cuerpo de la lambda y que ahora se puede crear una plantilla de forma arbitraria para una lambda nular. Esto será muy útil para la implementación de las construcciones en tiempo de compilación mencionadas anteriormente.
fuente