Por quanto tempo um parâmetro (capturado por valor) dentro de uma expressão lambda é válido? O parâmetro é válido durante a vida útil do próprio lambda ou é válido apenas durante a chamada?
Por exemplo, dado isto:
[value = 5] { DoSomething(&value) }
O &value
ponteiro permanece válido após o término da chamada lambda? (Claro, supondo que o lambda em si ainda esteja vivo.)
Eu já vi essa pergunta com nome semelhante, mas trata da modificação do lambda dentro da expressão, não do tempo de vida.
Para responder aos comentários, também suspeito value
que seja capturado como membro (e portanto deveria permanecer vivo fora da expressão). Mas estou preocupado que isso possa estar errado porque value
teoricamente poderia ser capturado como um membro, mas depois passado para a própria expressão por valor (e, portanto, a referência que vemos não permaneceria viva).
Um lambda é uma abreviação para uma estrutura anônima
operator()
que é gerada automaticamente pelo compilador.As capturas por valor são, na verdade, membros de dados nesta estrutura (em relação à captura por referência - elas podem ou não introduzir um membro - veja o comentário de @NathanOliver).
O ponteiro
&value
(que é o endereço de um membro de dados) é válido enquanto a instância desta estrutura estiver ativa.Pode ser após a execução do lambda.
Por exemplo no seguinte caso:
o ponteiro
&value
para o qual é passadoDoSomething
é válido atél
sair do escopo na parte inferior}
e ser destruído.