我有一堂课,有一个这样的公共std::function
成员:
class B
{
public:
B(std::function<void(void)> _func = NULL) : m_function(_func) { }
std::function<void()> m_function;
};
我有一个X
带有成员函数的类SomeFunction
:
class X
{
public:
void SomeFunction(const std::string & _s)
{
//...
}
};
我也有一个A
返回类型为object的对象的类B
,如下所示:
class A
{
private:
X x;
public:
B GetObjectB()
{
std::string local = "abc";
return B(([&]() -> void { x->SomeFunction(local); }))
}
};
然后执行
A a;
B b = a.GetObjectB();
b.m_function();
在SomeFunction
调用该函数之前,代码可以正常工作,_s
尽管local
输入参数已作为输入参数传递,但输入参数没有值。
我在这里做错了什么?
您要告诉您的lambda通过引用([&]
)进行默认捕获,并且它正在捕获local
对该堆栈的引用。作为堆栈变量,当范围退出时,该变量将被释放,因此返回的对象my_function
已捕获了悬空的引用。尝试一下[=]
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句