C ++ 0x lambda yakalama değeri her zaman sabit mi?


103

Değere göre yakalamanın ve yakalanan değeri sabit olmayan yapmanın bir yolu var mı? Sabit olmayan ancak olması gereken bir yöntemi yakalamak ve çağırmak istediğim bir kütüphane işleci var.

Aşağıdakiler derlemez ancak foo :: operator () const yapmak onu düzeltir.

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


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

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

  return 0;
}

Yanıtlar:


167

Değiştirilebilir kullanın.


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

Değiştirilebilir olmadan, lambda nesnesi const'ın operatörünü () bildirmiş olursunuz.


-5

Değişken kullanmanın alternatif bir yolu var (Crazy Eddie tarafından önerilen çözüm).

[=] İle bloğunuz tüm nesneleri değerlere göre yakalar. Tüm nesneleri referans alarak yakalamak için [&] kullanabilirsiniz :

auto bar = [&] () -> bool

Veya yalnızca belirli bir nesneyi referans alarak yakalayabilirsiniz [=, & afoo] :

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

Ön ayrıntılar için bu sayfaya bakın ( Açıklama bölümü): http://en.cppreference.com/w/cpp/language/lambda


11
Bu tamamen farklı şeyler yapar. Değiştirilemezler. Bu, OP'nin sorusuna yanıt vermiyor.
Edward Strange

1
Bu çözümün sorunu, lambda çalıştırılmadan önce yok edilen yakalanan yerel değişkenler için çalışmamasıdır (örneğin, ayrılmış bir std :: thread başlattığınızda).
Simon Ninon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.