c++ - 如何在 lambda 捕获列表中创建指针?
问题描述
我们如何在c++ lambda 捕获列表中创建指针?例如,我们可以创建一个整数变量并使 lambda 有状态:
auto lambda1 = [a = int{ 5 }]() mutable {
a = 3;
}
但是,当我们将 a 更改为指针时,编译器不起作用:
auto lambda2 = [a = void* { nullptr }]() mutable {
a = ...;
}
另一种解决方法是在外面声明一个指针,然后复制它,但这似乎很多余
void* a;
auto lambda3 = [a]() mutable {
a = ...
}
解决方案
你可以static_cast
到nullptr
void*
auto lambda2 = [a = static_cast<void*>(nullptr)]() mutable {
// ..
};
话虽如此,您似乎想将指向某些任意类型的指针捕获到 lambda。不应该使用模板来完成吗?也许你想看看 lambda 表达式中的通用 lambda或模板参数列表
感谢@HolyBlackCat指出这一事实,这std::nullptr_t
不适用于此案
int x;
std::nullptr_t p = &x;// error: 'initializing': cannot convert from 'int *' to 'nullptr'
因此它不能用于这种情况。
#include <cstddef> // std::nullptr_t
auto lambda2 = [a = std::nullptr_t{}]() mutable {
// ...
};
std::nullptr_t
是空指针文字的类型,nullptr
. 它是一种独特的类型,它本身不是指针类型或指向成员类型的指针。它的值是空指针常量(请参阅 参考资料NULL
),并且可以隐式转换为任何指针和指向成员类型的指针。
推荐阅读
- kubernetes - 无法安装第三个 kubernetes 主节点:kubelet TLS bootstrapping timeout in kubeadm join
- python - AttributeError:“顺序”对象没有属性“输出名称”
- angular - 组件 Angular 6 中的动态模板
- java - 如何从Java中的String打印一个单词及其后面的字符以获取特定长度
- javascript - 动态脚本加载 Zendesk 小部件
- flask - 气流数据库查询
- haskell - 将haskell代码概括/编译成lambda
- javascript - 计算印度语中的字符数(印地语、泰米尔语支持所有印度语)
- javascript - 使用 Math.max 调用 Array.prototype.map 返回 NaN 数组
- localization - Tapestry 5 中的电子邮件模板本地化?