首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候在lambda中更喜欢显式捕获而不是隐式捕获?

什么时候在lambda中更喜欢显式捕获而不是隐式捕获?
EN

Stack Overflow用户
提问于 2015-12-22 16:49:12
回答 2查看 3.3K关注 0票数 11

有时,我在包含5个局部变量(包括参数)的本地函数中执行std::find_if (例如)。但是,传入STL算法的lambda I只需要访问其中的一个。我可以用两种方式来捕捉这一点:

代码语言:javascript
复制
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;
    });
}

或者我可以:

代码语言:javascript
复制
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使用的规则,所以在功能和实现方面,我认为两者是相同的。什么时候对隐式捕获使用显式捕获?我唯一的想法在某种程度上与封装原则有关:只有访问所需的东西,编译器才能帮助您确定何时访问不应该访问的变量。它还使方法的本地状态(它是不变量,在函数执行期间的生存期)更安全。但这些真的是实际的问题吗?

对于隐式捕获,是否有使用显式捕获的功能原因?什么是好的经验法则或最佳实践?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-20 12:12:35

  • 显式捕获总是比较可取的,因为它不太容易出错。
  • 如果是重物(不是简单的int,double等),最好使用。
  • 当您计划在变量捕获范围之外使用lambda时,请使用Use =。获得对本地销毁变量的引用是危险的。
票数 5
EN

Stack Overflow用户

发布于 2015-12-23 08:17:05

在运行时使用[=][&]是最简单和最有效的,而不命名任何名称。

在这些情况下,正如this answer所描述的,只有在使用odr时才会捕获变量。换句话说,编译器只捕获所需的内容。

如果指定捕获列表,则可能会出现两个差异:

  • 你忘了捕捉兰博达用的东西
  • 你捕捉到了兰博达不需要的东西。

在第二种情况下,如果按值捕获,这意味着对象被不必要地复制。

因此,我的建议是使用[][&][=],除非您可以在特定情况下想出其他好的理由。其中一种情况可能是,如果您想通过引用捕获一些变量,通过值捕获一些变量。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34420701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档