gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:35:36 25 4
gpt4 key购买 nike

有时我会在具有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com