捕获函数指针作为参考

问题描述 投票:0回答:1

我想了解为什么以下代码会出现分段错误:

#include <functional>
#include <iostream>

struct Foo {
    Foo() = default;

    void callback1() {
        std::cout << "1 was called!" << std::endl;
    }

    void callback2() {
        std::cout << "2 was called!" << std::endl;
    }
};

std::function<void()> init(Foo& foo, void (Foo::*member_fn)()) {
    std::function<void()> func = [&foo, &member_fn]() {
                                    (foo.*member_fn)();
                                 };

    return func;
}

int main(int argc, char** argv) {
    Foo foo;

    auto func = init(foo, &Foo::callback1);

    func();

    return 0;
}

如果我按值捕获

func
,则调用
member_fn
效果很好,但我不明白为什么这很重要?

c++ lambda
1个回答
0
投票

您按值传递成员函数指针,即创建一个副本,到函数,然后通过引用捕获该副本。当你调用 lambda 时,副本已经消失,引用也悬空了。

改为按值捕获:

std::function<void()> init(Foo& foo, void (Foo::*member_fn)()) {
    std::function<void()> func = [&foo, member_fn]() { (foo.*member_fn)();};   
    return func;
}
© www.soinside.com 2019 - 2024. All rights reserved.