Erro do compilador C3489
'var' é necessário quando o modo de captura padrão é por valor
Quando você especifica que o modo de captura padrão para uma expressão lambda é por valor, não é possível passar uma variável por valor para a cláusula de captura dessa expressão.
Para corrigir este erro
Não passe explicitamente a variável para a cláusula de captura, ou
Não especifique por valor como o modo de captura padrão, ou
Especifique por referência como o modo de captura padrão, ou
Passe a variável por referência à cláusula de captura. (Isso pode alterar o comportamento da expressão lambda.)
Exemplos
O seguinte exemplo gera o erro C3489: a variável n
aparece por valor na cláusula capture de uma expressão lambda cujo modo padrão é por valor:
// C3489a.cpp
int main()
{
int n = 5;
[=, n]() { return n; } (); // C3489
}
O seguinte exemplo mostra quatro resoluções possíveis para C3489:
// C3489b.cpp
int main()
{
int n = 5;
// Possible resolution 1:
// Do not explicitly pass n to the capture clause.
[=]() { return n; } ();
// Possible resolution 2:
// Do not specify by-value as the default capture mode.
[n]() { return n; } ();
// Possible resolution 3:
// Specify by-reference as the default capture mode.
[&, n]() { return n; } ();
// Possible resolution 4:
// Pass n by reference to the capture clause.
[&n]() { return n; } ();
}