First Class Functions

Capturing Local Variables in C++ Lambdas

How can I capture local variables from the enclosing scope when using lambdas in C++? What are the different capture modes and when should I use each?

Abstract art representing computer programming

Lambdas in C++ can capture variables from the enclosing scope to use within the lambda body. There are two primary ways to capture:

  1. Capture by value - Capture a copy of the variable. Denoted by [var] or [=] to capture all local variables by value.
  2. Capture by reference - Capture a reference to the variable. Denoted by [&var] or [&] to capture all local variables by reference.

Here's an example demonstrating both:

#include <iostream>

int main() {
  int a{1};
  int b{2};

  auto by_val = [a]() { return a; };
  auto by_ref = [&b]() { b++; };

  std::cout << by_val() << ' ' << a << '\n';
  by_ref();
  std::cout << b << '\n';
}
1 1
3

Capture by value is used when you want the lambda to have its own copy of the data that won't be modified externally. Capture by reference is used when you want to modify external data or avoid copying.

Some additional notes:

  • Capturing by reference can lead to dangling references if the referenced data goes out of scope, so extra care must be taken.
  • You can mix captures, like [a, &b], capturing some variables by value and others by reference.
  • Capturing this in a class method will give access to class members.
  • Avoid capturing by reference if the lambda will outlive the current scope.
This Question is from the Lesson:

First Class Functions

Learn about first-class functions in C++: a feature that lets you store functions in variables, pass them to other functions, and return them, opening up new design possibilities

Answers to questions are automatically generated and may not have been reviewed.

This Question is from the Lesson:

First Class Functions

Learn about first-class functions in C++: a feature that lets you store functions in variables, pass them to other functions, and return them, opening up new design possibilities

A computer programmer
Part of the course:

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Free, unlimited access

This course includes:

  • 125 Lessons
  • 550+ Code Samples
  • 96% Positive Reviews
  • Regularly Updated
  • Help and FAQ
Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2024 - All Rights Reserved