我已阅读上一个问题here,但似乎有点无关。 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本身引起的,无论它是否捕获事物。
答案 0 :(得分: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;
};