Tenho um lambda operando std::array
que é inicializado e às vezes reinicializado dentro do lambda:
std::array<int, 10> nums; // indeterminate values
auto reinitNums{true};
const auto lambda{
[&] (auto&&... args) {
// always initialized before first use
if (reinitNums) {
// ...
reinitNums = false;
}
// use nums
if (condition) {
regenerateNums = true;
}
}
};
// call the lambda a number of times
O array e reinitNums
não são usados fora do lambda, então movê-los para a captura init pode ser desejável:
const auto lambda{
[
nums = std::array<int, 10>{}, // filled with zeros
reinitNums = true
] (auto&&... args) mutable {
if (reinitNums) {
// rewrite the zeros
reinitNums = false;
}
// as before
}
};
O problema é que isso aciona a inicialização de valor:
nums = std::array<int, 10>{}
O mesmo acontece com a versão entre parênteses:
nums = std::array<int, 10>()
Uma versão sem nenhuma delas nums = std::array<int, 10>
não compila.
É possível ter uma captura init inicializada por padrão?
Não, não é possível diretamente. O mais próximo que você pode chegar é criar sua própria classe wrapper cujo construtor padrão tenha um corpo vazio, sem nenhuma lista de inicializadores de membros, e inicializá-la por valor.