我想了解为什么以下代码会出现分段错误:
#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
效果很好,但我不明白为什么这很重要?
您按值传递成员函数指针,即创建一个副本,到函数,然后通过引用捕获该副本。当你调用 lambda 时,副本已经消失,引用也悬空了。
改为按值捕获:
std::function<void()> init(Foo& foo, void (Foo::*member_fn)()) {
std::function<void()> func = [&foo, member_fn]() { (foo.*member_fn)();};
return func;
}