Скажи, что у меня есть шаблонное действие
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]
) и не использую временный, я получаю ошибку компиляции (мое выражение потеряло бы некоторые постоянные-определители ...)
Почему я не могу захватить свою лямбда-функцию по значению вместо использования временной?