C ++ 0x przechwytywanie lambda przez wartość zawsze const?

102

Czy istnieje sposób na przechwycenie według wartości i uczynienie przechwyconej wartości inną niż stała? Mam funktor biblioteczny, który chciałbym przechwycić i wywołać metodę, która nie jest stała, ale powinna być.

Poniższe nie kompiluje się, ale wykonanie foo :: operator () const naprawia to.

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
źródło

Odpowiedzi:

165

Użyj mutable.


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

Bez mutable deklarujesz operator () stałej obiektu lambda.

Edward Strange
źródło
-5

Istnieje alternatywny sposób korzystania z mutable (rozwiązanie zaproponowane przez Crazy Eddie).

Z [=] Twój blok obejmuje wszystkie obiekty według wartości. Możesz użyć [&], aby przechwycić wszystkie obiekty przez odniesienie:

auto bar = [&] () -> bool

Lub możesz przechwycić tylko określony obiekt [= i afoo] przez odniesienie :

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

Zapoznaj się z tą stroną, aby uzyskać szczegółowe informacje ( sekcja Objaśnienia ): http://en.cppreference.com/w/cpp/language/lambda

Vlad
źródło
11
To robi zupełnie inne rzeczy. Nie są wymienne. To nie odpowiada na pytanie PO.
Edward Strange
1
Problem z tym rozwiązaniem polega na tym, że nie działa ono dla przechwyconych zmiennych lokalnych zniszczonych przed wykonaniem lambdy (na przykład podczas uruchamiania odłączonego std :: thread).
Simon Ninon