Que signifie [=] en C ++?


93

Je veux savoir ce que [=]fait? Voici un petit exemple

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);

Comment le code fonctionnerait-il au []lieu de [=]?

Je suppose que

std::function<T (T)>

signifie un prototype de fonction qui obtient (T)comme argument et type de retour T?


4
C'est bizarrement hautement voté pour quelque chose qui semble poser 3 questions différentes non recherchées et qui est un double de Qu'est-ce qu'une expression lambda en C ++ 11?
underscore_d

Je suis d'accord avec @underscore_d - On dirait qu'un clic fait augmenter la note, non? :)
BitTickler

Réponses:


108

Le [=]auquel vous faites référence fait partie de la liste de capture de l'expression lambda. Cela indique à C ++ que le code à l'intérieur de l'expression lambda est initialisé afin que le lambda obtienne une copie de toutes les variables locales qu'il utilise lors de sa création. Cela est nécessaire pour que l'expression lambda puisse faire référence à factoret offset, qui sont des variables locales à l'intérieur de la fonction.

Si vous remplacez le [=]par [], vous obtiendrez une erreur du compilateur car le code à l'intérieur de l'expression lambda ne saura pas à quoi les variables offsetet factorréférencera. De nombreux compilateurs donnent de bons messages d'erreur de diagnostic si vous faites cela, alors essayez-le et voyez ce qui se passe!


13
"Ceci est nécessaire" - cette option exacte n'est pas nécessaire; nous pourrions aussi écrire [&], [=offset, =input]etc.
MM

1
@MM - Cela ne capture-t-il pas les références aux habitants?
Inutile le

5
@MM L'utilisation d'une capture de référence ici serait un problème car les durées de vie de ces variables locales prendront fin dès que le lambda est retourné. Vous avez raison de dire que nous pourrions énumérer les variables individuelles individuellement, cependant.
templatetypedef

45

C'est une liste de capture lambda . Rend les variables disponibles pour le lambda. Vous pouvez utiliser les [=]copies par valeur ou celles [&]qui passent par référence.


3
Vous pouvez également utiliser []ce qui ne capture rien. :)
Daniel Kamil Kozar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.