97 votes

Que signifie [=] en C++ ?

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 avec [] 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 votes

Il s'agit bizarrement d'un vote élevé pour quelque chose qui semble poser trois questions différentes sans recherche et qui est un double de Qu'est-ce qu'une expression lambda en C++11 ?

0 votes

Je suis d'accord avec @underscore_d - On dirait qu'un clic est en train de booster le classement, non ? :)

1 votes

Il est très bien noté parce que GOOGLE a décidé de vous envoyer ici si vous cherchez ce que [=] signifie en C++, sans savoir ce que le mot Lambda signifie.

112voto

templatetypedef Points 129554

Le site [=] à laquelle vous faites référence fait partie de la liste de capture pour l'expression lambda. Cela indique au 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 lorsqu'il est créé. Ceci est nécessaire pour que l'expression lambda puisse se référer à factor y offset qui sont des variables locales dans la fonction.

Si vous remplacez le [=] con [] vous obtiendrez une erreur de compilation car le code à l'intérieur de l'expression lambda ne saura pas ce que sont les variables offset y factor se référer à. De nombreux compilateurs donnent de bons messages d'erreur de diagnostic si vous faites cela, alors essayez et voyez ce qui se passe !

13 votes

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

1 votes

@M.M - Est-ce que cela ne capture pas les références aux locaux ?

5 votes

@M.M. L'utilisation d'une capture de référence ici poserait un problème car la durée de vie de ces variables locales se termine dès que la lambda est retournée. Vous avez raison de dire que nous pourrions lister les variables individuellement, cependant.

49voto

kometen Points 37

C'est un lambda liste de capture. Rend les variables disponibles pour le lambda. Vous pouvez utiliser [=] qui copient par valeur, ou [&] qui passe par référence.

3 votes

Vous pouvez également utiliser [] qui ne capture rien :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X