C ++ 0x lambda capture berdasarkan nilai selalu const?

102

Apakah ada cara untuk menangkap berdasarkan nilai, dan membuat nilai yang ditangkap menjadi non-konstan? Saya memiliki functor perpustakaan yang saya ingin menangkap & memanggil metode yang non-const tetapi harus.

Berikut ini tidak dapat dikompilasi tetapi membuat foo :: operator () const memperbaikinya.

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
sumber

Jawaban:

165

Gunakan bisa berubah.


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

Tanpa bisa berubah Anda mendeklarasikan operator () dari objek lambda const.

Edward Strange
sumber
-5

Ada cara alternatif untuk menggunakan mutable (solusi yang diusulkan oleh Crazy Eddie).

Dengan [=] blok Anda menangkap semua objek berdasarkan nilai. Anda dapat menggunakan [&] untuk menangkap semua objek dengan referensi:

auto bar = [&] () -> bool

Atau Anda dapat menangkap hanya dengan referensi objek tertentu [=, & afoo] :

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

Lihat halaman ini untuk detail kedepan ( bagian Penjelasan ): http://en.cppreference.com/w/cpp/language/lambda

Vlad
sumber
11
Ini melakukan hal yang sangat berbeda. Mereka tidak bisa saling menggantikan. Ini tidak menanggapi pertanyaan OP.
Edward Strange
1
Masalah dari solusi ini adalah ia tidak bekerja untuk variabel lokal yang ditangkap dimusnahkan sebelum lambda dijalankan (misalnya, ketika Anda memulai std :: thread yang terlepas).
Simon Ninon