C ++ 0x acquisizione lambda per valore sempre const?


102

Esiste un modo per acquisire in base al valore e rendere il valore acquisito non const? Ho un funtore di libreria che vorrei catturare e chiamare un metodo che non è const ma dovrebbe esserlo.

Quanto segue non si compila ma la creazione di foo :: operator () const lo risolve.

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


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

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

  return 0;
}

Risposte:


165

Usa mutevole.


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

Senza mutable stai dichiarando l'operatore () dell'oggetto lambda const.


-5

C'è un modo alternativo per usare mutable (soluzione proposta da Crazy Eddie).

Con [=] il tuo blocco acquisisce tutti gli oggetti in base ai valori. Puoi utilizzare [&] per acquisire tutti gli oggetti per riferimento:

auto bar = [&] () -> bool

Oppure puoi acquisire per riferimento solo determinati oggetti [=, & afoo] :

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

Fare riferimento a questa pagina per i dettagli preliminari ( sezione Spiegazione ): http://en.cppreference.com/w/cpp/language/lambda


11
Questo fa cose completamente diverse. Non sono intercambiabili. Questo non risponde alla domanda dell'OP.
Edward Strange,

1
Il problema di questa soluzione è che non funziona per le variabili locali catturate distrutte prima che venga eseguito lambda (ad esempio, quando si avvia uno std :: thread separato).
Simon Ninon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.