O código abaixo trava quando o lambda f
é chamado.
No entanto, minha expectativa é que, como o pacote de parâmetros é capturado por valor dentro da função "wrapper", ele deveria ter funcionado bem!
Alguém poderia ajudar com o entendimento correto?
void argPrinter(double d, int v, bool b) {
cout << "argPrinter: " << " " << d << " " << v << " " << b << endl;
}
template <typename Callable, typename... Args>
auto wrapper(Callable op, Args&&... args) {
auto result = [&op, args...] () mutable {
// args... are captured by value.
cout << "Hello\n";
op(args...);
};
return result;
}
int main() {
auto f = wrapper(argPrinter, 28.7, -99, true);
f(); // **SIGSEGV at this call!!**
}
O problema não é o pacote de parâmetros, mas sim a captura de
op
.A função
wrapper
aceita oCallable op
parâmetro por valor .Mas o lambda
result
nele o captura por referência (&op
). Isso significa que a captura está referenciando owrapper
argumento da funçãoop
, que sai do escopo quando a função retorna.Seu lambda agora contém uma referência pendente a ele.
Para resolver o problema, você pode alterar a captura lambda de
op
para ser por valor .De qualquer forma, isso parece algo simples de fazer, já que você já passou por valor para
wrapper
:Demonstração ao vivo