在模板类中捕获时出现段错误

时间:2018-09-23 02:50:49

标签: c++11 gcc

在学习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 ++错误。

1 个答案:

答案 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;
}