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