Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ lambda. How need to capture the pointer?

For example, there is a method:

void foo( A* p )
{
    auto l = [=](){ /* Do Something using p */ };

   // Use l ...
}

How I should to capture the pointer: by reference or by value? Inside lambda p is not changed, just used its methods.

like image 995
kaa Avatar asked Jan 11 '23 00:01

kaa


1 Answers

The fact that it is a pointer doesn't affect your decision about ref or value capture. Since a pointer is small enough and you don't want to write it, you can capture by value.

I usually use the following rule:

  • if it's bigger than a pointer, use a reference because the copying might be more expensive than the dereference
  • if you want to see changes from outside the lambda, obviously references are the only option
  • otherwise (if it's small and doesn't change) capture by value

So a pointer that doesn't change should be captured by value. If the compiler detects that there are no writes, it might optimize a capture by reference and pass by value anyway, but I'm not sure.

like image 57
Antoine Avatar answered Jan 13 '23 12:01

Antoine