Почему не может быть захвачена моя лямбда-функция c ++? - PullRequest
4 голосов
/ 03 мая 2011

Скажи, что у меня есть шаблонное действие

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

Я использую Action следующим образом:

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

Теперь, если я не использую временную для копирования значения, на которое ссылается обратный вызов, он компилируется нормально, но я получаю ошибку времени выполнения (мой обратный вызов потерян). Если я передаю свой лямбда-аргумент обратного вызова по значению (то есть [=callback]) и не использую временный, я получаю ошибку компиляции (мое выражение потеряло бы некоторые постоянные-определители ...)

Почему я не могу захватить свою лямбда-функцию по значению вместо использования временной?

1 Ответ

11 голосов
/ 03 мая 2011

Если вы захватываете копию, вы не можете изменить ее по умолчанию, так как operator() лямбда-выражения объявляется const.Вам нужно добавить mutable к вашей лямбде, чтобы разрешить изменение захваченных переменных:

XCallbackInvoker (Action< int > callback)
    : CallbackInvoker< X >(
        Action< ::boost::shared_ptr< X > >(
           [callback](::boost::shared_ptr< X > x) mutable -> void
           {
               callback(x->errorCode());
           }))
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...