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;
}

Odpowiedzi:


165

Użyj mutable.


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

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


-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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.