2016-09-30 5 views
21

Que signifie la ligne de code suivante?Que signifie [&] avant la fonction?

auto allowed = [&](int x, const std::vector<int>&vect){ 

.... 

} 

Que signifie [&]? et est-ce fonction avec le même nom de la variable ??

parce qu'il a utilisé de cette façon: unsigned short ok = get_allowed(0, vect);

+1

C'est une liste de capture pour un lambda (cf http: //en.cppreference.com/w/cpp/langue/lambda) –

+0

Ce n'est pas une fonction mais un lambda. Vous devriez lire sur ceux – Hayt

+0

Juste un heads-up, j'ai fermé [this] (http://stackoverflow.com/questions/12262019/c-operator) comme une dupe de cette question. IMHO les réponses ici sont plus détaillées. – NathanOliver

Répondre

45

Cela signifie que la fonction lambda capturera toutes les variables de la portée par référence. Pour utiliser d'autres variables que celles qui ont été transmises à lambda, vous pouvez utiliser capture-clause []. Vous pouvez capturer à la fois par référence et valeur, vous pouvez spécifier à l'aide & et = respectivement:

  • [=] capture toutes les variables dans la portée par la valeur
  • [&] capture toutes les variables dans la portée par référence
  • [&var] capture var par référence
  • [&, var] spécifier que la capture par défaut est par référence et que nous voulons capturer var
  • [=, &var] capture les variables portée par la valeur par défaut, mais capturer var en utilisant la référence à la place
+0

Bon point * par référence *. Upvoted. – Bathsheba

+0

Bien sûr, celui qui manque dans C++ 11 au moins est la capacité de capturer une seule variable de membre de classe. Vous devez basculer vers des objets de fonction bon vieux jeu dans ce cas. – Bathsheba

+0

Correctement pointé, nous devons capturer 'this' pointeur dans le cas de la variable membre de la classe. – user3286661

13

Il y a une liste de capture lambda et a été défini en C++ de la norme C++ 11.

[&] Cela signifie que vous voulez accéder à toutes les variables par la référence actuellement dans la portée de la fonction lambda.

Il est de votre responsabilité de vous assurer que les objets référencés sont toujours dans la portée au moment où la fermeture est invoquée, sinon le comportement du programme est undefined.

5

Il définit une expression Lambda, qui est essentiellement une fonction sans nom. Il a la liste de paramètres (int x, const std::vector<int>&vect) et un corps de fonction { ... }. Mais il a également une liste de capture au début [&]. Si vous voulez accéder à une variable (qui n'est pas un paramètre) du corps de l'expression lambda, vous devez faire l'expression "prendre la variable avec lui-même", de sorte que la variable puisse être utilisée plus tard quand l'expression lambda sera réalisé.

Vous pouvez soit fournir une liste de variables, soit utiliser "tout" pour les capturer toutes. [&] signifie capturer tous par référence, et [=] signifierait capturer tous par valeur. (Si vous utilisez [&], notez que le corps lambda utilisera la valeur de la variable au moment de l'exécution de lambda, et non la valeur qui était valide lorsque vous avez créé le lambda! une copie de la valeur, seulement une référence à celle-ci.)

+1

Upvoted; joli point fait à la fin. Ne hésitez pas à mentionner le cas de référence pendante comme je fais allusion à dans ma réponse. – Bathsheba

+0

Renvoyé pour le point que vous avez fait à la fin aussi. –