调用从lambda崩溃作为模板参数传递的成员函数指针

时间:2019-01-31 23:18:10

标签: c++

我有以下代码:

#include <functional>

struct Foo {
    void Callback()
    {}
};

template <class T, class P>
std::function<void()> MemCB(T &t, P p) 
{
    //return [&]() {t.Callback();}; //no issues if done this way.
    return [&]() {(t.*p)();};
}


int main()
{
    Foo f;
    std::function<void()> func = MemCB(f, &Foo::Callback);
    func();
}

这会崩溃(至少在启用优化的情况下),问题是 尝试在此处调用成员函数:

 return [&]() {(t.*p)();};

正在发生什么,导致这里出现问题?

有没有什么方法可以像我在此处尝试的那样传入对象t和成员函数p的指针,并在p对象上调用t

1 个答案:

答案 0 :(得分:1)

您的问题是,捕获的p变成悬挂的“参考”,将其更改为:

template <class T, class P>
std::function<void()> MemCB(T &t, P p) 
{
    return [&, p]() {(t.*p)();};
}