Condividi tramite


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; } ();
}

Vedi anche

Espressioni lambda