自动绑定到lamba函数的寿命是多少

What is the life span of an automatic bound to a lamba function?

本文关键字:多少 函数 绑定 lamba      更新时间:2023-10-16

如果一个自动机绑定到一个lambda函数,那么自动机的寿命是否会延长到lambda函数的寿命?

最简单的情况:

auto genfunc (int start)
{
     int count=start;
     return [&count] {
         return count++;
     };
}

这是好的,还是未定义的行为?

否,count的生存期不会延长,因为您通过引用捕获了它。寿命延长规则列在§12.2[class.temporary]第4项和第5项中;5,并且都不包括在lambda中通过引用捕获。

调用genfunc返回的lambda将导致未定义的行为。§5.1.2/24[expr.prim.lambda]中的注释中提到了这一点

注意:如果实体是通过引用隐式或显式捕获的,那么在实体的生存期结束后调用相应lambda表达式的函数调用运算符可能会导致未定义行为--尾注]

自动挡的寿命会延长到lambda函数的寿命吗?

没有。lambda在这里可能会混淆,所以让我们将其重写为一个结构:

struct X
{
    int operator()() const { return ref++; }
    int& ref;
};
auto genfunc (int start)
{
    int count=start;
    return X{count};
}

我们创建的X对象包含一个对临时(count(的引用(ref(,该引用在对象返回后立即超出范围。lambda没有什么特别之处——悬空引用就是悬空引用。

不过,没有理由保留引用,只需按值捕获即可:

auto genfunc (int start)
{
     return [start]() mutable {
         return start++;
     };
}

注意所需的mutable关键字。