Я провел эксперимент, он работает с g ++ 8.1 и падает с segfault на g ++ 7.3.С помощью трассировки gdb обнаруживается, что при возникновении ошибки указатель this
, захваченный лямбда-выражением, равен нулю, что связано со стратегией компилятора по инициализации лямбда-переменной (указатель this
еще не инициализирован, когда компиляторинициализирует лямбду).Это может работать, помещая инициализацию в список инициализации конструктора:
#include <iostream>
#include <functional>
using namespace std;
template <int X = 42>
struct Test {
int x = X;
void printer() {
cout << "this value: " << x << endl;
}
std::function<void()> lambda;
Test():lambda([this] {printer();}){}
};
int main()
{
Test<> t;
t.lambda();
return 0;
}