Mayank Jain Production Engineer at Facebook Inc.

Mutable lambdas in C++

This post is in continuation to Lambdas in C++.

Till now we covered basics of functors and lambdas in C++. We will cover Mutable lambdas in this post.

Mutable Lambdas

Object captured in lambda are immutable by default. This is because operator() of the generated functor (compiler generates functional object for lambdas) is const by default. Consider below C++ code:

#include<iostream>

int main(){
   int a=10;
    auto lam = [a](){a;};
    lam();
    return 0;
}

Assembly code for lambda lam generated by gcc 4.9.4 is:

main::{lambda()#1}::operator()() const:
  push rbp
  mov rbp, rsp
  mov QWORD PTR [rbp-8], rdi
  pop rbp
  ret

As you can see that const keyword is present in generated functor of lambda main::{lambda()#1}::operator()() const. This const prevent us from modifying objects in lambda captured by value.

int a=10;
auto lam = [a](){a++;}; //Compilation error 

Using mutable keyword allows us to mutate objects captured by value too.

int a=10;
auto lam = [a]() mutable {a++;};

If we see the assembly code for same code the generated functor after adding mutable keyword looks like:

main::{lambda()#1}::operator()()

We can clearly see that const is no longer present now. So adding mutable keyword makes operator() non-const.

In general lambda declaration mutable keyword comes before return-type

auto func = [a]() mutable -> int {++a; std::cout << a; return a;};

That’s it for mutable lambdas. I think we covered basics of lambdas. We will start with R-value reference from next blog post.

Till then Sayonara.