2010-05-14 6 views
67

Y at-il un moyen de capturer par valeur, et rendre la valeur capturée non-const? J'ai un foncteur de bibliothèque que je voudrais capturer & appeler une méthode qui est non-const mais devrait être.C++ 0x capture lambda par valeur toujours const?

Ce qui suit ne compile pas mais 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; 
} 

Répondre

104

Utiliser mutable.


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

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

0

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 certain objet [=, & afoo]:

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

Référez à cette page pour les détails avant (Explication section): http://en.cppreference.com/w/cpp/language/lambda

+7

Cela fait des choses complètement différentes. Ils ne sont pas interchangeables. Cela ne répond pas à la question du PO. –

+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 de lambda (par exemple, lorsque vous démarrez un thread std :: détaché). –