Compiler Error C3488

Visual Studio 2015
 

The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at Compiler Error C3488.

var' is not allowed when the default capture mode is by-reference

When you specify that the default capture mode for a lambda expression is by-reference, you cannot pass a variable by reference to the capture clause of that expression.

To correct this error

  • Do not explicitly pass the variable to the capture clause, or

  • Do not specify by-reference as the default capture mode, or

  • Specify by-value as the default capture mode, or

  • Pass the variable by value to the capture clause. (This might change the behavior of the lambda expression.)

The following example generates C3488 because a reference to the variable n appears in the capture clause of a lambda expression whose default mode is by-reference:

// C3488a.cpp  
  
int main()  
{  
   int n = 5;  
   [&, &n]() { return n; } (); // C3488  
}  

The following example shows four possible resolutions to C3488:

// C3488b.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-reference as the default capture mode.  
   [&n]() { return n; } ();  
  
   // Possible resolution 3:  
   // Specify by-value as the default capture mode.  
   [=, &n]() { return n; } ();  
  
   // Possible resolution 4:  
   // Pass n by value to the capture clause.  
   [n]() { return n; } ();  
}  

Lambda Expressions

Show: