¿Cómo funciona lambda genérico ( auto
palabra clave como tipo de argumento) en el estándar C ++ 14?
¿Se basa en plantillas C ++ donde para cada tipo de argumento diferente, el compilador genera una nueva función con el mismo cuerpo pero tipos reemplazados (polimorfismo en tiempo de compilación) o es más similar a los genéricos de Java (borrado de tipos)?
Ejemplo de código:
auto glambda = [](auto a) { return a; };
Respuestas:
Las lambdas genéricas se introdujeron en
C++14
.Simplemente, el tipo de cierre definido por la expresión lambda tendrá un operador de llamada con plantilla en lugar del operador normal de llamada sin plantilla de
C++11
lambdas (por supuesto, cuandoauto
aparezca al menos una vez en la lista de parámetros).Entonces tu ejemplo:
Hará
glambda
una instancia de este tipo:El párrafo 5.1.2 / 5 del Borrador estándar de C ++ 14 n3690 especifica cómo se define el operador de llamada del tipo de cierre de una expresión lambda determinada:
Finalmente:
Como explica el párrafo anterior, las lambdas genéricas son simplemente azúcar sintáctico para functores únicos y sin nombre con un operador de llamada con plantilla. Eso debería responder a su pregunta :)
fuente
int main () { struct X {}; std::vector<X> x; }
)Desafortunadamente , no forman parte de C ++ 11 ( http://ideone.com/NsqYuq ):
Con g ++ 4.7:
sin embargo , la forma en que podría implementarse en C ++ 14 según la propuesta de Portland para lambdas genéricas :
Esto produciría en su mayor parte la creación habitual de una clase functora anónima, pero con la falta de tipos, el compilador emitiría un miembro con plantilla
operator()
:O según la propuesta más reciente Propuesta para expresiones lambda genéricas (polimórficas)
Entonces sí, para cada permutación de parámetros, surgiría una nueva instanciación, sin embargo, los miembros de ese functor aún serían compartidos (es decir, los argumentos capturados).
fuente
-std=c++1y
.auto
tiene las mismas reglas de deducción que el auto clásico? Si nos referimos a la analogía de la plantilla, significaría que el auto no es automático, son las mismas reglas que la deducción del tipo de plantilla. Entonces la pregunta es: ¿la deducción por plantilla es equivalente aauto
?static
oregister
:) De todos modos, sí, usarauto
allí significa que, bajo el capó, se genera una plantilla normal. De hecho, una lambda será reemplazada internamente por un compilador por una clase functor, y unauto
parámetro significa quetemplate <T> ... (T ...)
se emitirá.Es una característica propuesta de C ++ 14 (no en C ++ 11) similar (o incluso equivalente) a las plantillas. Por ejemplo, N3559 proporciona este ejemplo:
fuente