C ++ 0x lambda captura por valor siempre const?

102

¿Hay alguna forma de capturar por valor y hacer que el valor capturado no sea constante? Tengo un functor de biblioteca que me gustaría capturar y llamar a un método que no es constante pero que debería serlo.

Lo siguiente no se compila, pero hacer foo :: operator () const lo soluciona.

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
fuente

Respuestas:

165

Utilice mutable.


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

Sin mutable, está declarando el operador () del objeto lambda const.

Edward extraño
fuente
-5

Hay una forma alternativa de usar mutable (solución propuesta por Crazy Eddie).

Con [=] tu bloque captura todos los objetos por valores. Puede usar [&] para capturar todos los objetos por referencia:

auto bar = [&] () -> bool

O puede capturar por referencia solo cierto objeto [=, & afoo] :

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

Consulte esta página para obtener más detalles ( sección Explicación ): http://en.cppreference.com/w/cpp/language/lambda

Vlad
fuente
11
Esto hace cosas completamente diferentes. No son intercambiables. Esto no responde a la pregunta del OP.
Edward Strange
1
El problema de esta solución es que no funciona para las variables locales capturadas destruidas antes de que se ejecute la lambda (por ejemplo, cuando inicia un std :: thread separado).
Simon Ninon