使用 lambda 默认按值捕获有哪些陷阱([=]
)或通过引用([&]
)在 C++11 中?
我知道一些陷阱,例如:
- 如果从 lambda 创建的闭包的生命周期超过了局部变量的生命周期,闭包中的引用将悬空?
默认按值捕获有什么缺点吗?
我认为你提到的悬空参考问题是主要的陷阱。
然而,有时会被忽视的另一件事是,即使在成员函数中使用按值捕获 lambda,它也不会创建所使用的成员变量的副本,而只会创建this
指针。
首先,这意味着您再次面临悬空指针问题;其次,您可能会意外修改 lambda 范围之外的变量,即使看起来您只是修改本地副本。
例如。这将打印0 1 1
代替0 1 0
struct Foo {
int bar=0;
int bas() {
auto inc = [=]() {
bar++; //this is equivalent to this->bar++
return bar;
};
return inc();
}
};
int main() {
Foo foo;
std::cout << foo.bar <<" ";
std::cout << foo.bas() << " ";
std::cout << foo.bar << std::endl;
}
编辑:
只是为了避免与@Snps 提出的观点相关的混淆:
If bar
是一个局部变量bas()
(因此通过值捕获),上面的 lambda 不会编译,因为按值捕获的变量默认为 const,除非您明确指定 lambda 为可变的。
因此,如果您仔细想想,很明显 bar 没有被复制,但是在阅读或编写代码时很容易忘记这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)