据我所知,[=]复制函数体内使用的所有变量,而[this]只复制this指针.但看看样品,我看到[=]广泛使用的地方[this]或[this, foo]足够.是否有任何理由(例如性能增益)[this]而不是[=]?
Xeo*_*Xeo 10
没有性能提升,因为如你所说,只复制你在lambda中实际使用的变量[=].†编码器的部分主要是懒惰,保持lambda头部简洁.如果使用新变量,则必须扩展capture子句以包含这些变量,meh.但是,有时候,您希望/必须明确,例如,当您想要按引用和按值捕获混合时.
†请注意,目前,以下代码段中的[=](或偶数[x])不会将成员变量复制到lambda中,这与您的预期相反:
struct X{
std::function<void()> f(){
return [=]{ std::cout << "x: " << x << "\n"; };
}
int x;
};
Run Code Online (Sandbox Code Playgroud)
相反,你会得到一份副本this.如果lambda超出父对象,并且为了使其正常运行,这可能会导致问题,您当前需要在主体内部创建一个本地名称f并捕获/使用它.此名称可以是引用或值.我更喜欢引用,因为它少了一个副本(对于引用,成员将仅复制到lambda中,而对于值,首先将成员复制到该成员然后复制到lambda中).‡
struct X{
std::function<void()> f(){
auto& x_ref = x;
return [=]{ std::cout << "x: " << x_ref << "\n"; };
}
int x;
};
Run Code Online (Sandbox Code Playgroud)
但是,有一项建议是让[=]and [member_name]capture子句复制该成员.如果您想要参考,则需要捕获[this].
‡感谢@MooingDuck的启蒙.
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |