C++延长 && 的使用寿命

C++ extending lifetime of &&

本文关键字:延长 C++      更新时间:2023-10-16

在下面的示例中:

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)();有效?

它真的应该有效,还是这只是我的未定义行为等于正确的结果?

附言读完这篇文章后,我只看到一种解释:在 (2) 中,临时生存期延长到表达式结束,调用发生在与 && crteation 相同的表达式中;而 (1) 实际上由 2 个表达式组成:

存在与函数调用中的引用参数的临时绑定 直到包含该函数调用的完整表达式结束:if 该函数返回一个引用,该引用的寿命超过完整表达式, 它变成了一个悬而未决的参考。

是这样吗?

一个临时对象会持续到创建它的尾(嗯,完整的表达式),除非生存期延长。

您的代码不会延长任何临时对象的生存期。 通过绑定到引用来延长生存期不会"交换",只有第一个绑定会延长生存期。

所以最糟糕的情况是UB,因为你有一个悬而未决的参考。 所引用的临时消失在行尾:在下一行 uou 跟随引用,混乱发生。

在第二种情况下,您的引用不会延长临时的生存期,但临时引用的持续时间比绑定到它的引用持续时间更长! 他们都死在生产线的尽头,按构造的相反顺序。

所以调用有效。

它真的应该有效,还是这只是我的未定义行为等于正确的结果?

好像是这样。在您链接的示例中,您有以下警告:

warning: '<anonymous>' is used uninitialized in this function [-Wuninitialized]

初始化的对象具有不确定的值,尝试访问这些值会导致未定义的行为。