gpt4 book ai didi

c++ - Lambda 通过引用捕获引用变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:37 25 4
gpt4 key购买 nike

对于 lambda,我想通过引用捕获一些已经通过引用保存在外部范围中的内容。假设引用的值比 lambda 长,但不是创建 lambda 的范围。

I know that如果 lambda 按值 捕获引用变量,则将复制引用的对象。我想避免这种复制。

但是如果我通过引用捕获一个引用变量会发生什么?如果原始引用变量在执行 lambda 之前超出范围怎么办?这样安全吗?换句话说:是引用后面的对象还是lambda中引用的引用变量

auto f() {
const auto & myRef = g();
return [&]{ myRef.doSomething(); };
}

f()(); // Safe?

最佳答案

是的,通过引用捕获对象的关键问题是被引用对象的生命周期,而不是用于获取它的任何中间引用的生命周期。您可以将引用视为别名而不是实际变量。 (并且在类型系统中,引用与常规变量的处理方式不同。)引用为原始对象起别名,并且独立于用于为对象起别名的其他别名(除了它们为同一对象起别名这一事实)。

=====EDIT=====

根据给this SO question的回答(由 dyp 指出),看来这可能并不完全清楚。在整个语言的其余部分,“对引用的引用”的概念没有意义,并且从引用创建的引用成为该引用的对等体,但显然标准对这种情况和 lambda 捕获有点含糊引用在某种意义上可能是次要的,取决于从中捕获它们的堆栈帧。 (SO 答案引用的明确措辞特别调用了引用的实体,从表面上看,只要原始对象存在,这种用法就是安全的,但绑定(bind)机制可能暗示捕获链很重要。)

我希望这在 C++14/17 中得到澄清,我希望它得到澄清以保证这种用法的合法性。特别是,我认为 C++14/17 通过表达式捕获变量的能力将使通过堆栈帧指针简单地捕获范围变得更加困难,最明智的捕获机制通常是捕获特定实体个别地。 (如果通过引用捕获实际的本地对象,则可能允许堆栈帧捕获,因为如果在任何情况下在范围之外调用 lambda,这将导致 UB。)

在我们得到一些澄清之前,这可能无法移植。

关于c++ - Lambda 通过引用捕获引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23067111/

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