繁体   English   中英

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

[英]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使用的规则,所以在功能和实现方面,我认为两者都是相同的。 什么时候使用显式捕获而不是隐式捕获? 我唯一的想法与封装原则有些相关:只能访问所需的东西,编译器可以帮助您确定何时访问变量。 它还保持方法的本地状态(它的不变量,在执行期间函数的生命周期)更安全。 但这些真的是实际问题吗?

是否存在使用显式捕获而不是隐式捕获的功能性原因? 遵循什么是好的经验法则或最佳做法?

  • 显式捕获总是优选的,因为它不易出错
  • 在重物(不是简单的int,double等)的情况下使用&更好
  • 当您计划在变量捕获范围之外使用lambda时使用=。 有了&有悬而未决的参考当地销毁变量的风险

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

在这种情况下,如由这个答案 ,变量,只有当他们是ODR使用的拍摄。 换句话说,编译器只捕获所需的内容。

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

  • 你忘了捕捉lambda使用的东西
  • 你捕获了lambda不需要的东西。

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

所以,我的建议是使用[][&][=]除非你能想到一个特殊情况的好理由。 一个这样的情况可能是你想要通过引用和一些值来捕获一些变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM