¿Qué significa [=] en C ++?


93

Quiero saber que [=]hace He aquí un breve ejemplo

template <typename T>
std::function<T (T)> makeConverter(T factor, T offset) {
    return [=] (T input) -> T { return (offset + input) * factor; };
}

auto milesToKm = makeConverter(1.60936, 0.0);

¿Cómo funcionaría el código en []lugar de [=]?

yo asumo eso

std::function<T (T)>

¿Significa un prototipo de función que obtiene (T)como argumento y tipo de retorno T?


4
Curiosamente, se ha votado mucho por algo que parece plantear 3 preguntas diferentes no investigadas y es un duplicado de ¿Qué es una expresión lambda en C ++ 11?
underscore_d

Estoy de acuerdo con @underscore_d: parece que un clic está aumentando la calificación, ¿verdad? :)
BitTickler

Respuestas:


108

El al [=]que te refieres es parte de la lista de captura de la expresión lambda. Esto le dice a C ++ que el código dentro de la expresión lambda se inicializa para que lambda obtenga una copia de todas las variables locales que usa cuando se crea. Esto es necesario para que la expresión lambda pueda referirse a factory offset, que son variables locales dentro de la función.

Si reemplaza el [=]con [], obtendrá un error de compilación porque el código dentro de la expresión lambda no sabrá cuáles son las variables offsety factorse refieren a. Muchos compiladores dan buenos mensajes de error de diagnóstico si hace esto, ¡así que pruébelo y vea qué sucede!


13
"Esto es necesario": esta opción exacta no es necesaria; también podríamos escribir [&], [=offset, =input]etc.
MM

1
@MM - ¿Eso no captura referencias a los lugareños?
Inútil

5
@MM Usar una captura de referencia aquí sería un problema porque la vida útil de esas variables locales finalizará tan pronto como se devuelva la lambda. Sin embargo, tiene razón en que podríamos enumerar las variables individuales individualmente.
templatetypedef

45

Es una lista de captura lambda . Hace que las variables estén disponibles para lambda. Puede utilizar [=]qué copias por valor o [&]qué pasa por referencia.


3
También puedes usar []que no capture nada. :)
Daniel Kamil Kozar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.