据我了解,[=]
复制函数体中使用的所有变量,而[this]
仅复制this
指针。但是看一下示例,我看到[=]
广泛用于[this]
或[this, foo]
就足够了。是否有任何理由(例如性能提升)使用[this]
而不是[=]
?
答案 0 :(得分:10)
没有性能提升,因为如你所说,只有你在lambda中实际使用的变量被复制为[=]
。†它主要是懒惰在编码器的一部分,保持lambda头简洁。如果使用新变量,则必须扩展capture子句以包含这些变量,meh。但是,有时候,您希望/必须明确,例如,当您想要按引用和按值捕获混合时。
†请注意,目前,以下代码段中的[=]
(或甚至[x]
)将不将成员变量复制到lambda中,与您的预期相反:
struct X{
std::function<void()> f(){
return [=]{ std::cout << "x: " << x << "\n"; };
}
int x;
};
相反,您将获得this
的副本。如果lambda超过父对象,并且为了使其行为正确,这可能会导致问题,您当前需要在f
的主体内部创建一个本地名称并捕获/使用它。此名称可以是引用或值。我更喜欢引用,因为它少了一个副本(对于引用,成员将只复制到lambda中,而对于值,首先将成员复制到该成员然后复制到lambda中)。‡功能
struct X{
std::function<void()> f(){
auto& x_ref = x;
return [=]{ std::cout << "x: " << x_ref << "\n"; };
}
int x;
};
但是,there is a proposal要使[=]
和[member_name]
捕获子句复制该成员。如果您想要参考,则需要捕获[this]
。
‡感谢@MooingDuck启蒙。