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

Calling a member function pointer passed as template argument from lambda crashes

本文关键字:成员 函数 指针 崩溃 参数传递 lambda 调用      更新时间:2023-10-16

我有以下代码:

#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就像我在这里尝试的那样,并在t对象上调用p

您的问题是捕获p成为悬而未决的"引用",请将其更改为:

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