C++ 延长 && 的生命周期
C++ extending lifetime of &&
在下面的例子中:
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; 相同的表达式中而 (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.
是这样吗?
Should it really work, or thats just my undefined behavior equals correct result?
好像是。在您链接的示例中,您有以下警告:
warning: '<anonymous>' is used uninitialized in this function [-Wuninitialized]
未初始化的对象具有不确定的值,尝试访问这些值会导致未定义的行为。
一个临时对象持续到创建它的行(好吧,完整的表达)结束,除非生命周期被延长。
您的代码不会延长任何临时对象的生命周期。通过绑定到引用来延长生命周期不会 "commute",只有第一个绑定会延长生命周期。
所以第一种情况是 UB,因为您有一个悬空引用。引用的临时文件消失在行尾:在下一行你跟随引用,混乱发生了。
在第二种情况下,您的引用不会延长临时文件的生命周期,但临时文件的寿命比绑定到它的引用长!他们都死在了行尾,按照相反的构造顺序。
所以通话有效。
在下面的例子中:
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; 相同的表达式中而 (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.
是这样吗?
Should it really work, or thats just my undefined behavior equals correct result?
好像是。在您链接的示例中,您有以下警告:
warning: '<anonymous>' is used uninitialized in this function [-Wuninitialized]
未初始化的对象具有不确定的值,尝试访问这些值会导致未定义的行为。
一个临时对象持续到创建它的行(好吧,完整的表达)结束,除非生命周期被延长。
您的代码不会延长任何临时对象的生命周期。通过绑定到引用来延长生命周期不会 "commute",只有第一个绑定会延长生命周期。
所以第一种情况是 UB,因为您有一个悬空引用。引用的临时文件消失在行尾:在下一行你跟随引用,混乱发生了。
在第二种情况下,您的引用不会延长临时文件的生命周期,但临时文件的寿命比绑定到它的引用长!他们都死在了行尾,按照相反的构造顺序。
所以通话有效。