在学习C ++ 11功能时,我注意到这段代码因segfault而崩溃:
#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 = [this] {printer();};
};
int main()
{
Test<> t;
t.lambda();
return 0;
}
如果我将Test设置为常规结构而不是模板,则可以使用。这是为什么? 操作系统:Ubuntu 16.04,编译器:g ++ 6.3
编辑:适用于Clang。必须是G ++错误。
答案 0 :(得分:1)
我做了实验,它可以在g ++ 8.1上运行,并在g ++ 7.3上因segfault崩溃。通过gdb跟踪发现,发生错误时,lambda捕获的this
指针为空,这与编译器初始化lambda变量(this
指针不是尚未在编译器初始化lambda时初始化)。可以通过将初始化放在构造函数的初始化列表中来工作:
#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;
}