5

据我了解,[=]复制函数体内使用的所有变量,而[this]只复制this指针。但是看看样本,我发现[=]它被广泛使用在哪里[this]或者[this, foo]就足够了。是否有任何理由(例如性能提升)来[this]代替[=]

4

1 回答 1

10

没有性能提升,因为正如您所说,只有您在 lambda 中实际使用的变量被复制用于[=]. †</sup> 这主要是编码人员的懒惰并保持 lambda 头部简洁。如果您使用新变量,则必须扩展捕获子句以包含这些变量,并且 meh。但是,有时,您希望/必须是明确的,例如当您想要混合按引用和按值捕获时。


† 请注意,目前,以下代码段中的[=](甚至)不会将成员变量复制到 lambda 中,这与您的预期相反:[x]

struct X{
  std::function<void()> f(){
    return [=]{ std::cout << "x: " << x << "\n"; };
  }

  int x;
};

相反,您将获得this. 如果 lambda 比父对象寿命长,这可能会导致问题,并且为了使其行为正确,您目前需要在主体内创建一个本地名称f并捕获/使用它。此名称可以是引用或值。我更喜欢引用,因为它少了一个副本(对于引用,成员将只复制到 lambda 中,而对于值,成员首先复制到该引用,然后复制到 lambda)。‡</sup>

struct X{
  std::function<void()> f(){
    auto& x_ref = x;
    return [=]{ std::cout << "x: " << x_ref << "\n"; };
  }

  int x;
};

但是,有一个建议是让[=]and [member_name]capture 子句复制成员。如果您需要参考,则需要捕获[this].


‡ 感谢@MooingDuck的启发。

于 2012-11-04T21:04:17.063 回答