簡體   English   中英

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

[英]Why can't my c++ lambda function be captured?

假設我有一個模板操作

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_;
};

我像這樣使用動作:

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());
               }))
    {
    }
};

編輯:添加了 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_;
};

現在,如果我不使用臨時復制回調引用的值,它編譯得很好,但我得到一個運行時錯誤(我的回調丟失)。 如果我按值傳遞我的 lambda 回調參數(即[=callback] )並且不使用臨時值,我會收到編譯錯誤(我的表達式會丟失一些 const-volatile 限定符......)

為什么我不能按值而不是使用臨時捕獲我的 lambda function?

如果通過復制捕獲,則默認情況下無法修改它,因為 lambda 的operator()被聲明為const 您需要將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