解码神奇的“ ”运算符:理解“ []{}” Lambda
在一个令人困惑的观察中,一个单独的“ ”前缀C 中的 lambda 表达式奇迹般地实现了其重新分配。这个神秘的魔法引发了一个问题:为什么下面的代码能够编译成功?
int main() { auto test = +[]{}; // The "+" operator casts a lambda to a function pointer test = []{}; }
答案就在 C 标准的晦涩深处。 “” 触发 lambda 到普通旧函数指针的转换。 lambda 是非捕获的,本质上拥有到具有相同签名的函数指针的转换函数。此转换函数按照 C 标准中的定义,返回与 lambda 的函数调用运算符行为相同的函数的地址。
一元 " " 运算符,当应用于 lambda 生成的闭包对象时,涉及一组内置重载。这些重载之一接受任何指针类型并将其转换为函数指针。因此,闭包类型到函数指针(唯一候选重载函数)的转换具有优先权。
因此,“auto test = []{};”中“test”的类型被推导为“void(*)()”。这种函数指针兼容性使得可以将第二个 lambda/closure 对象分配给“test”,即使它们的闭包类型不同。
这些知识揭示了“[]{}”lambda 成功背后的秘密。通过将 lambda 转换为函数指针,它绕过了重新定义 lambda 的限制,解锁了分配新 lambda 对象的能力。
以上是为什么 `[]{}` 在 C 中启用 Lambda 重新分配?的详细内容。更多信息请关注PHP中文网其他相关文章!