Here is a minimal program that segfaults with gcc-8.3.0, compiled with -std=c++2a:
struct Command {
double x;
};
template <typename T>
struct AutoBrake {
AutoBrake(const T& publish) : publish{ publish } {}
const T& publish;
};
int main()
{
int count{};
AutoBrake brake{ [&count](const Command&) {
count += 1;
} };
brake.publish(Command{ 1.1f });
}
Debugging shows that it crashes when accessing the count reference inside the lambda expression when running brake.publish.
However if the command struct does not contain any fields, the program runs fine:
struct Command {};
...
AFAIK since Command is taken as a const reference, its lifetime should be extended to the end of main here, so it should not be a dangling reference to a temporary.
Moreover if I do not access count in the lambda the program does not segfault:
...
int count{};
AutoBrake brake{ [&count](const Command&) {} };
brake.publish(Command{});
...
Finally, if I first store the lambda as a variable it does not segfault:
int count{};
auto func = [&count](const Command&) { count += 1; };
AutoBrake brake{ func };
brake.publish(Command{});