c++λ.需要如何捕获指针
C++ lambda. How need to capture the pointer?
例如,有一个方法:
void foo( A* p )
{
auto l = [=](){ /* Do Something using p */ };
// Use l ...
}
如何捕获指针:通过引用还是通过值?内部lambda p没有改变,只是使用了它的方法
它是一个指针的事实并不影响你关于ref值捕获的决定。因为指针足够小,你不想写它,你可以按值捕获。
我通常使用以下规则:
- 如果它比指针大,则使用引用,因为复制可能比解引用更昂贵
- 如果你想看到lambda外部的变化,引用显然是唯一的选择
- 否则(如果它很小并且不改变)按值捕获
所以一个不改变的指针应该被value捕获。如果编译器检测到没有写操作,它可能会根据引用优化捕获并按值传递,但我不确定。
指针没有方法(用c++术语来说就是成员函数)。你可能是说你只调用了p
所指向的对象的成员函数。因此,如果不希望影响p
本身,就不需要通过引用来捕获它。所以只要按值捕获它,就像现在这样
如果您有一个真正的本地lambda—其生命周期不超过其作用域—由[&]
捕获通常是无害的。在许多情况下,这些引用可以被相当聪明的编译器当作纯粹的别名来处理,这使得它们的行为不像'局部函数'那样。
如果在您的局部作用域中有很多状态,那么准确地描述您捕获的内容有时是很困难的好。并且=
在小型廉价对象(如int
或指针)上具有微不足道的复制也可以像别名一样处理,特别是对于非mutable
lambdas。
然而,如果你的闭包超出了局部作用域,&
捕获是不安全的,我甚至建议不要显式地使用=
——捕获,并确保捕获的任何指针都有足够的生命周期。
对于指针来说,修改指针与修改指针所指向的数据是完全不同的。在不修改指针本身的情况下捕获指针的副本不会导致任何问题。
相关文章:
- 在C++中释放内存期间,迭代器与指针有何不同
- 在提升::生成中捕获指针
- 如何在 lambda 中访问捕获的此指针的"typeid"?
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 如何捕获函数参数并存储函数指针以供以后在 C++11 中执行?
- 将捕获的 lambda 包装为模板函数中的函数指针
- 如何定义与将 Lambda 与捕获作为回调一起使用兼容的函数指针
- C++:读取 Lambda 捕获的指针时出现访问冲突
- 如果唯一指针是捕获的值,为什么它不能在 lambda 内移动?
- 删除指针后C++尝试/捕获
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 通过在迭代指针键映射上出错来捕获非确定性
- 通过嵌套的lambda中的值捕获指针导致Segfault
- dynamic_cast指针异常捕获
- Lambda 函数捕获错误的指针"this"
- 重置在 lambda 函数中捕获的共享指针
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- 指向成员函数的指针与指向数据成员的指针有何不同
- 对齐方式与指针中尾随零的数量有何关系
- c++λ.需要如何捕获指针