Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';t我的c++;可以捕获lambda函数吗?_C++_Lambda_C++11 - Fatal编程技术网

C++ 为什么可以';t我的c++;可以捕获lambda函数吗?

C++ 为什么可以';t我的c++;可以捕获lambda函数吗?,c++,lambda,c++11,C++,Lambda,C++11,假设我有一个模板动作 template <class ArgT> struct Action { Action(::boost::function< void(ArgT) > func) : func_(func) { } void operator()(ArgT arg) { func_(arg); } private: ::boost::function< voi

假设我有一个模板动作

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_;
};
模板
结构动作
{
操作(::boost::functionfunc)
:func_(func)
{
}
void运算符()(ArgT arg)
{
func_(arg);
}
私人:
::boost::函数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());
               }))
    {
    }
};
class XCallbackInvoker:PublicCallbackInvoker
{
公众:
XCallbackInvoker(操作回调)
:CallbackInvoker(
操作<::boost::共享\u ptr>(
[&callback](::boost::shared_ptrX)->void
{
动作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_;
};
模板
类CallbackInvoker:public ICallbackInvoker
{
公众:
CallbackInvoker(操作<::boost::共享\u ptr>回调)
:回调(回调)
{
}
void invoke(::boost::shared_ptr消息)
{
回调函数(::boost::static_pointer_cast(消息));
}
私人:
动作<::boost::共享\u ptr>回调;
};
现在,如果我不使用临时函数来复制回调引用的值,它可以很好地编译,但会出现运行时错误(我的回调丢失)。如果我按值(即
[=callback]
)将回调参数传递给lambda,并且不使用临时参数,则会出现编译错误(我的表达式将丢失一些常量volatile限定符…)


为什么我不能通过值来捕获lambda函数,而不是使用临时函数?

如果通过复制来捕获,那么默认情况下您无法修改它,因为lambda的
操作符()
声明为
常量。您需要向lambda添加
mutable
,以允许修改捕获的变量:

XCallbackInvoker (Action< int > callback)
    : CallbackInvoker< X >(
        Action< ::boost::shared_ptr< X > >(
           [callback](::boost::shared_ptr< X > x) mutable -> void
           {
               callback(x->errorCode());
           }))
{
}
XCallbackInvoker(操作回调)
:CallbackInvoker(
操作<::boost::共享\u ptr>(
[回调](::boost::shared_ptrX)可变->无效
{
回调(x->errorCode());
}))
{
}

请您也发布
CallbackInvoker
的代码,以便我们可以自己编译它?如果您有编译器错误,通常最好将其复制到问题中,而不是将其压缩为“我的表达式将丢失一些常量volatile限定符”。错误消息可能暗示是什么特殊用途触发了问题。谢谢Anthony,我不知道lambdas上的可变技巧。或者将
struct Action
operator()
声明为
const
@Ben Voigt:很可能是更合适的解决方案。@ildjarn:不过,这两个都值得一提。我也不知道“安东尼”的把戏。