2010-05-14 9 views
67

¿Hay alguna forma de capturar por valor y hacer que el valor capturado no const? Tengo un functor de biblioteca que me gustaría capturar & llamar a un método que no es const pero debería ser.C++ 0x captura lambda por valor siempre const?

Lo siguiente no se compila pero haciendo foo :: operator() const lo corrige.

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


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

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

    return 0; 
} 

Respuesta

104

Usar mutable.


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

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

0

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

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

auto bar = [&]() -> bool 

O puede capturar únicamente por referencia determinado objeto [=, & afoo]:

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

se refieren a este página para más detalles (Explicación sección): http://en.cppreference.com/w/cpp/language/lambda

+7

Esto hace cosas completamente diferentes. No son intercambiables. Esto no responde a la pregunta del OP. –

+1

El problema de esta solución es que no funciona para las variables locales capturadas destruidas antes de que se ejecute el lambda (por ejemplo, cuando se inicia un std :: thread separado). –

Cuestiones relacionadas