我在这里阅读了上一个问题但似乎有点无关。 C ++ lambda不能捕获任何内容时,可以作为v8::FunctionTemplate的参数。 但是,当捕获到我需要的东西时,编译器开始抱怨:

error: no matching function for call to 'v8::FunctionTemplate::New( BaseContext::New(const v8::Arguments&)::<lambda(const v8::Arguments&)>)

这是测试代码:

int a = 3;

Local<FunctionTemplate> failed = FunctionTemplate::New(
[=, a](const Arguments& args)-> Handle<Value>
{   
    a = a+a;
}); 


Local<FunctionTemplate> success = FunctionTemplate::New(
[](const Arguments &args) -> Handle<Value>
{
    int a = 3;
});

我想使用lambda功能,因为没有理由定义小的静态函数,而这些静态函数实际上将成为另一个函数的回调。 但是捕获和不捕获之间的唯一区别确实让我感到困扰,并且错误消息似乎是由lambda本身引起的,无论它是否捕获了事物。

===============>>#1 票数:1 已采纳

这是因为不能捕获的lambda可以被视为普通函数指针,而不能捕获的lambda则可以被视为普通函数指针。

FunctionTemplate::New的第一个参数是InvocationCallback ,它只是一个函数指针。

typedef Handle<Value> (*InvocationCallback)(const Arguments& args);

例如,两个都是有效的std::function对象:

// Compiles
function<Handle<Value> (const Arguments&)> cb1 = [](const Arguments &args) -> Handle<Value> {
    int a = 3;
};

// Compiles
function<Handle<Value> (const Arguments&)> cb2 = [=](const Arguments &args) -> Handle<Value> {
    int a = 3;
};

但是只有第一个是有效的回调:

// Compiles
InvocationCallback cb1 = [](const Arguments &args) -> Handle<Value> {
    int a = 3;
};

// Does not compile
InvocationCallback cb2 = [=](const Arguments &args) -> Handle<Value> {
    int a = 3;
};

  ask by snowmantw translate from so

未解决问题?本站智能推荐: