gpt4 book ai didi

C++ 延长 && 的生命周期

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:22 26 4
gpt4 key购买 nike

在下面的例子中:

http://coliru.stacked-crooked.com/a/7a1df22bb73f6030

struct D{
int i;
auto test2(int&& j){
return [&](){ // captured by reference!
cout << i*(j);
};
}
};

int main()
{
D d{10};
{
auto fn = d.test2(10);
fn(); // 1. wrong result here

d.test2(10)(); // 2. but ok here
}
}

为什么 d.test2(10)(); 有效?

它真的应该起作用,还是我未定义的行为等于正确的结果?

P.S. 看完this我只看到一种解释:在 (2) 中,临时生命周期延长到表达式的末尾,并且调用发生在与 && crteation; 相同的表达式中。 while (1) 实际上由 2 个表达式组成:

a temporary bound to a reference parameter in a function call exists until the end of the full expression containing that function call: if the function returns a reference, which outlives the full expression, it becomes a dangling reference.

是这样吗?

最佳答案

除非延长生命周期,否则临时对象会持续到创建它的(好吧,完整表达式)的末尾。

您的代码不会延长任何临时对象的生命周期。通过绑定(bind)到引用来延长生命周期不会“通勤”,只有第一个绑定(bind)会延长生命周期。

所以第一种情况是 UB,因为您有一个悬空引用。所引用的临时对象消失在行尾:在下一行,你跟随引用,困惑发生了。

在第二种情况下,您的引用不会延长临时对象的生命周期,但临时对象比绑定(bind)到它的引用持续时间更长!他们都死在了这条线的末端,以相反的构建顺序。

所以调用有效。

关于C++ 延长 && 的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37515134/

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