首页  >  文章  >  后端开发  >  在 C 11 Lambda 中通过引用捕获引用是否可以保证对修改值的访问?

在 C 11 Lambda 中通过引用捕获引用是否可以保证对修改值的访问?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-03 22:39:03376浏览

Does Capturing a Reference by Reference in C  11 Lambdas Guarantee Access to the Modified Value?

在 C 11 Lambda 中通过引用捕获引用

问题:

考虑下面的代码片段:

<code class="cpp">#include <functional>
#include <iostream>

std::function<void()> make_function(int&amp; x) {
    return [&amp;]{ std::cout << x << std::endl; };
}

int main() {
    int i = 3;
    auto f = make_function(i);
    i = 5;
    f();
}</code>

我们能保证这个程序会输出5而不会遇到未定义的行为吗?这个问题特别是在通过引用([&])捕获变量 x 时出现,并且涉及一旦函数 make_function 返回,捕获对变量的引用是否会导致悬空引用。

答案:

是的,代码保证可以工作。

说明:

C 11 lambda 规范表明只要最初引用的对象仍然存在,此处捕获的引用就保持有效。这意味着即使 make_function 中的参数 x 在函数返回后超出范围,lambda 闭包仍然保留对整数 i 的有效引用。

澄清:

为了解决之前回复中的一些不准确之处:

  • C 中的“范围”指的是代码的静态词汇区域,其中非限定名称查找将名称与声明相关联。它与生命周期没有直接关系。
  • lambda 的“到达范围”规则根据语法规则确定何时允许捕获,而不是生命周期。

在这种特定情况下,变量x 位于 lambda 的可达范围内,并通过引用捕获。因此,引用仍然有效,并且 lambda 可以继续访问 i 的修改值。

结论:

此代码演示了如何正确捕获引用lambda 中的引用。保证输出 5 而不调用未定义的行为。

以上是在 C 11 Lambda 中通过引用捕获引用是否可以保证对修改值的访问?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn