Capture lambda C ++ 0x par valeur toujours const?

102

Existe-t-il un moyen de capturer par valeur et de rendre la valeur capturée non const? J'ai un foncteur de bibliothèque que je voudrais capturer et appeler une méthode qui n'est pas const mais devrait l'être.

Ce qui suit ne compile pas mais faire foo :: operator () const le corrige.

struct foo
{
  bool operator () ( const bool & a )
  {
    return a;
  }
};


int _tmain(int argc, _TCHAR* argv[])
{
  foo afoo;

  auto bar = [=] () -> bool
    {
      afoo(true);
    };

  return 0;
}
Zac
la source

Réponses:

165

Utilisez mutable.


auto bar = [=] () mutable -> bool ....

Sans mutable, vous déclarez l'opérateur () de l'objet lambda const.

Edward étrange
la source
-5

Il existe une autre manière d'utiliser mutable (solution proposée par Crazy Eddie).

Avec [=] votre bloc capture tous les objets par valeurs. Vous pouvez utiliser [&] pour capturer tous les objets par référence:

auto bar = [&] () -> bool

Ou vous pouvez capturer par référence uniquement certains objets [=, & afoo] :

auto bar = [=, &afoo] () -> bool

Reportez-vous à cette page pour plus de détails ( section Explication ): http://en.cppreference.com/w/cpp/language/lambda

Vlad
la source
11
Cela fait des choses complètement différentes. Ils ne sont pas interchangeables. Cela ne répond pas à la question du PO.
Edward Strange
1
Le problème de cette solution est qu'elle ne fonctionne pas pour les variables locales capturées détruites avant l'exécution du lambda (par exemple, lorsque vous démarrez un std :: thread détaché).
Simon Ninon