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

标签 c++ c++11 lambda

有时我会在具有 5 个局部变量(包括参数)的局部函数中执行 std::find_if(例如)。但是,我传递给 STL 算法的 lambda 只需要访问其中的一个。我可以通过以下两种方式之一捕捉到这一点:

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

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

最佳答案

  • 显式捕获总是更可取,因为它不易出错
  • 如果是重对象(不是简单的 int、double 等),最好使用 &
  • 当您计划在变量捕获范围之外使用 lambda 时使用 =。使用 & 获得对局部销毁变量的悬空引用是有风险的

关于c++ - 什么时候更喜欢 lambda 中的显式捕获而不是隐式捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34420701/

相关文章:

用于转换为任何本地时间的 c++ 库(由 linux zoneinfo 字符串定义)

c++ - 带有 GCC 和 clang 的 constexpr char 数组

c++ - 为什么编译器不能(或不能)推断出 static_cast 的类型参数?

c# - 为什么 C# 中的 lambda 表达式会导致内存泄漏?

c++ - -whole-library 不可用时的解决方法

c++ - char 缓冲区初始化的标准行为

c++ - 从 C++11 中的函数调用返回 std::vector 的正确方法( move 语义)

amazon-web-services - 云形成: S3 linked to Lambda gives The ARN is not well formed

C++11:如何通过继承使用 std::mem_fn 和 std::bind

c++ - Cout vector 地址