简体   繁体   English

为什么我的 c++ lambda function 抓不到?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM