Captura C ++ 0x lambda por valor sempre const?


102

Existe alguma maneira de capturar por valor e tornar o valor capturado não constante? Eu tenho um functor de biblioteca que gostaria de capturar e chamar um método que não é constante, mas deveria ser.

O seguinte não compila, mas fazer foo :: operator () const corrige isso.

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


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

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

  return 0;
}

Respostas:


165

Use mutável.


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

Sem mutável, você está declarando o operador () do objeto lambda const.


-5

Existe uma forma alternativa de usar mutável (solução proposta por Crazy Eddie).

Com [=] seu bloco captura todos os objetos por valores. Você pode usar [&] para capturar todos os objetos por referência:

auto bar = [&] () -> bool

Ou você pode capturar por referência apenas determinado objeto [=, & afoo] :

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

Consulte esta página para maiores detalhes ( seção Explicação ): http://en.cppreference.com/w/cpp/language/lambda


11
Isso faz coisas completamente diferentes. Eles não são intercambiáveis. Isso não responde à pergunta do OP.
Edward Strange

1
O problema desta solução é que ela não funciona para variáveis ​​locais capturadas destruídas antes de o lambda ser executado (por exemplo, quando você inicia um std :: thread separado).
Simon Ninon,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.