有时,我在包含5个局部变量(包括参数)的本地函数中执行std::find_if (例如)。但是,传入STL算法的lambda I只需要访问其中的一个。我可以用两种方式来捕捉这一点:
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使用的规则,所以在功能和实现方面,我认为两者是相同的。什么时候对隐式捕获使用显式捕获?我唯一的想法在某种程度上与封装原则有关:只有访问所需的东西,编译器才能帮助您确定何时访问不应该访问的变量。它还使方法的本地状态(它是不变量,在函数执行期间的生存期)更安全。但这些真的是实际的问题吗?
对于隐式捕获,是否有使用显式捕获的功能原因?什么是好的经验法则或最佳实践?
发布于 2016-04-20 12:12:35
发布于 2015-12-23 08:17:05
在运行时使用[=]或[&]是最简单和最有效的,而不命名任何名称。
在这些情况下,正如this answer所描述的,只有在使用odr时才会捕获变量。换句话说,编译器只捕获所需的内容。
如果指定捕获列表,则可能会出现两个差异:
在第二种情况下,如果按值捕获,这意味着对象被不必要地复制。
因此,我的建议是使用[]、[&]或[=],除非您可以在特定情况下想出其他好的理由。其中一种情况可能是,如果您想通过引用捕获一些变量,通过值捕获一些变量。
https://stackoverflow.com/questions/34420701
复制相似问题