c++λ.需要如何捕获指针

C++ lambda. How need to capture the pointer?

本文关键字:何捕获 指针 c++      更新时间:2023-10-16

例如,有一个方法:

void foo( A* p )
{
    auto l = [=](){ /* Do Something using p */ };
   // Use l ...
}

如何捕获指针:通过引用还是通过值?内部lambda p没有改变,只是使用了它的方法

它是一个指针的事实并不影响你关于ref值捕获的决定。因为指针足够小,你不想写它,你可以按值捕获。

我通常使用以下规则:

  • 如果它比指针大,则使用引用,因为复制可能比解引用更昂贵
  • 如果你想看到lambda外部的变化,引用显然是唯一的选择
  • 否则(如果它很小并且不改变)按值捕获

所以一个不改变的指针应该被value捕获。如果编译器检测到没有写操作,它可能会根据引用优化捕获并按值传递,但我不确定。

指针没有方法(用c++术语来说就是成员函数)。你可能是说你只调用了p所指向的对象的成员函数。因此,如果不希望影响p本身,就不需要通过引用来捕获它。所以只要按值捕获它,就像现在这样

如果您有一个真正的本地lambda—其生命周期不超过其作用域—由[&]捕获通常是无害的。在许多情况下,这些引用可以被相当聪明的编译器当作纯粹的别名来处理,这使得它们的行为不像'局部函数'那样。

如果在您的局部作用域中有很多状态,那么准确地描述您捕获的内容有时是很困难的好。并且=在小型廉价对象(如int或指针)上具有微不足道的复制也可以像别名一样处理,特别是对于非mutable lambdas。

然而,如果你的闭包超出了局部作用域,&捕获是不安全的,我甚至建议不要显式地使用=——捕获,并确保捕获的任何指针都有足够的生命周期。

对于指针来说,修改指针与修改指针所指向的数据是完全不同的。在不修改指针本身的情况下捕获指针的副本不会导致任何问题。