首页 > 后端开发 > C++ > 正文

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

Mary-Kate Olsen
发布: 2024-11-03 22:39:03
原创
448 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板