Consider this:
#include <iostream>
#include <functional>
std::function<void()> task;
int x = 42;
struct Foo
{
int& x;
void bar()
{
task = [=]() { std::cout << x << '\n'; };
}
};
int main()
{
{
Foo f{x};
f.bar();
}
task();
}
My instinct was that, as the actual referent still exists when the task is executed, we get a newly-bound reference at the time the lambda is encountered and everything is fine.
However, on my GCC 4.8.5 (CentOS 7), I'm seeing some behaviour (in a more complex program) that suggests this is instead UB because f
, and the reference f.x
itself, have died. Is that right?
To capture a member reference you need to utilize the following syntax (introduced in C++14):
this way
l_x
is anint &
stored in closure and referring to the sameint
valuem_x
was referring and is not affected by theFoo
going out of scope.In C++11 we can workaround this feature being missing by value-capturing a pointer instead:
You can capture a reference member in C++11 by creating a local copy of the reference and explicit capture to avoid capturing
this
: