c++ - 如何使用 C++ lambda 函数创建 v8::FunctionTemplate?

标签 c++ node.js lambda v8

我读过上一个问题 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 本身引起的,无论它是否捕获东西。

最佳答案

这是因为不捕获的 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;
};

关于c++ - 如何使用 C++ lambda 函数创建 v8::FunctionTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027574/

相关文章:

c++ - 您可以指定线程终止的顺序,即线程依赖性吗?

c++ - 函数模板链接错误

javascript - Node JS,如何从P12文件中提取X.509证书?

python - 数组中的 lambda 找不到变量值

javascript - 如何从 lambda 函数返回字符串?

c++ - 将数组存储在单独的类文件中

c++ - 生成一个线性随机整数C++

node.js - 如何在没有任何崩溃日志的情况下调试崩溃?

node.js - Firestore获取子集合的所有文档

c++ - 将共享指针存储在 lambda 中以使其保持事件状态