Errore del compilatore C3489
'var' è obbligatorio quando la modalità di acquisizione predefinita è per valore
Quando si specifica che la modalità di acquisizione predefinita per un'espressione lambda è in base al valore, non è possibile passare una variabile per valore alla clausola di acquisizione dell'espressione.
Per correggere l'errore
Non passare in modo esplicito la variabile alla clausola di acquisizione oppure
Non specificare l'acquisizione per valore come modalità predefinita oppure
Specificare l'acquisizione per riferimento come modalità predefinita oppure
Passare la variabile per riferimento alla clausola di acquisizione. In questo modo il comportamento dell'espressione lambda potrebbe cambiare.
Esempi
L'esempio seguente genera l'errore C3489 perché la variabile n
viene visualizzata per valore nella clausola di acquisizione di un'espressione lambda la cui modalità predefinita è per valore:
// C3489a.cpp
int main()
{
int n = 5;
[=, n]() { return n; } (); // C3489
}
L'esempio seguente mostra quattro possibili soluzioni all'errore 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; } ();
}