Dado o código a seguir que tenta alocar uma captura lambda no heap:
#include <array>
int test(void) {
//auto big_lambda = new auto([d = std::array<int, 1024>{5,1,2}]() { return d[2]; });
auto big_lambda = new auto(std::move([d = std::array<int, 1024>{5,1,2}]() { return d[2]; }));
auto res = (*big_lambda)();
delete big_lambda;
return res;
}
Por que encapsular o lambda std::move
cria a captura na pilha? É porque std::move
"materializa" o lambda temporário antes de ser passado para o construtor de movimento (acho?)?
std::move
não é uma conversão. Ela realiza uma conversão, mas, em última análise, é uma chamada de função. O que significa que precisa seguir as regras de uma chamada de função.Parâmetros de função não podem ser pré-valores. Se um argumento de uma função for um pré-valor, ela manifestará um temporário para preencher o parâmetro. E é isso que está acontecendo aqui.
Não há necessidade de usar
std::move
em nenhum caso. Em termos gerais, o argumento parastd::move
deve ser sempre um nome . Você move de uma variável. Expressões generalizadas que você sabe que são pré-valores não devem ser movidas de.