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?

der_lord
la source
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!

templatetypedef
la source
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.

kometen
la source
3
Vous pouvez également utiliser []ce qui ne capture rien. :)
Daniel Kamil Kozar