[英]Why can't my c++ lambda function be captured?
Say I have a templated Action假设我有一个模板操作
template <class ArgT>
struct Action
{
Action(::boost::function< void(ArgT) > func)
: func_(func)
{
}
void operator()(ArgT arg)
{
func_(arg);
}
private:
::boost::function< void(ArgT) > func_;
};
I use Action like so:我像这样使用动作:
class XCallbackInvoker : public CallbackInvoker< X >
{
public:
XCallbackInvoker (Action< int > callback)
: CallbackInvoker< X >(
Action< ::boost::shared_ptr< X > >(
[&callback](::boost::shared_ptr< X > x) -> void
{
Action< int > callbackCopy = callback;
callbackCopy(x->errorCode());
}))
{
}
};
Edit: CallbackInvoker added编辑:添加了 CallbackInvoker
template <class T>
class CallbackInvoker : public ICallbackInvoker
{
public:
CallbackInvoker(Action< ::boost::shared_ptr< T > > callback)
: callback_(callback)
{
}
void invoke(::boost::shared_ptr< IBase > message)
{
callback_(::boost::static_pointer_cast< T >(message));
}
private:
Action< ::boost::shared_ptr< T > > callback_;
};
Now if I don't use a temporary to copy the value referenced by callback, it compiles fine but I get a runtime error (my callback is lost).现在,如果我不使用临时复制回调引用的值,它编译得很好,但我得到一个运行时错误(我的回调丢失)。 If I pass my lambda the callback argument by value (that is
[=callback]
) and don't use the temporary, I get a compile error (my expression would lose some const-volatile qualifiers...)如果我按值传递我的 lambda 回调参数(即
[=callback]
)并且不使用临时值,我会收到编译错误(我的表达式会丢失一些 const-volatile 限定符......)
Why can't I capture my lambda function by value instead of using a temporary?为什么我不能按值而不是使用临时捕获我的 lambda function?
If you capture by copy then you cannot modify it by default, since the operator()
of the lambda is declared const
.如果通过复制捕获,则默认情况下无法修改它,因为 lambda 的
operator()
被声明为const
。 You need to add mutable
to your lambda to allow modifications of the captured variables:您需要将
mutable
添加到 lambda 以允许修改捕获的变量:
XCallbackInvoker (Action< int > callback)
: CallbackInvoker< X >(
Action< ::boost::shared_ptr< X > >(
[callback](::boost::shared_ptr< X > x) mutable -> void
{
callback(x->errorCode());
}))
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.