![](/img/trans.png)
[英]C++: Can you do a lambda implicit copy capture plus explicit copy capture?
[英]When to prefer explicit capture in lambda over implicit captures?
有时我会在本地函数中执行std::find_if
(例如),该函数有5个局部变量,包括参数。 但是,传入STL算法的lambda只需要访问其中的1个。 我可以通过以下两种方式之一来捕获它:
void foo(int one, int two, int three)
{
std::vector<int> m_numbers;
int four, five;
std::find_if(m_numbers.begin(), m_numbers.end(), [=](int number) {
return number == four;
});
}
或者我可以这样做:
void foo(int one, int two, int three)
{
std::vector<int> m_numbers;
int four, five;
std::find_if(m_numbers.begin(), m_numbers.end(), [four](int number) {
return number == four;
});
}
(注意我没有编译此代码,对任何语法错误或其他错误道歉)
我知道隐式捕获是基于odr使用的规则,所以在功能和实现方面,我认为两者都是相同的。 什么时候使用显式捕获而不是隐式捕获? 我唯一的想法与封装原则有些相关:只能访问所需的东西,编译器可以帮助您确定何时访问变量。 它还保持方法的本地状态(它的不变量,在执行期间函数的生命周期)更安全。 但这些真的是实际问题吗?
是否存在使用显式捕获而不是隐式捕获的功能性原因? 遵循什么是好的经验法则或最佳做法?
在运行时使用[=]
或[&]
是最简单和最有效的,无需命名任何名称。
在这种情况下,如由这个答案 ,变量,只有当他们是ODR使用的拍摄。 换句话说,编译器只捕获所需的内容。
如果指定捕获列表,则可能会出现两个差异:
在第二种情况下,如果按值捕获,则意味着对象被不必要地复制。
所以,我的建议是使用[]
, [&]
或[=]
除非你能想到一个特殊情况的好理由。 一个这样的情况可能是你想要通过引用和一些值来捕获一些变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.