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,因为您有一个悬空引用。引用的临时文件消失在行尾:在下一行你跟随引用,混乱发生了。

在第二种情况下,您的引用不会延长临时文件的生命周期,但临时文件的寿命比绑定到它的引用长!他们都死在了行尾,按照相反的构造顺序。

所以通话有效。