自动绑定到lamba函数的生命周期是多少?

时间:2015-08-03 20:04:38

标签: c++ c++11 lambda c++14

如果自动绑定到lambda函数,自动的生命是否延长到lambda函数的生命周期?

最简单的情况:

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

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

2 个答案:

答案 0 :(得分:6)

不,count的生命周期未延长,因为您通过引用捕获它。 {em>§12.2[class.temporary] ,第4项和第4项中列出Lifetime extension rules 5,并且都不包括lambda中的引用捕获。

调用genfunc返回的lambda将导致未定义的行为。 §5.1.2/ 24 [expr.prim.lambda]

中的注释中提到了这一点。
  

[注意:如果通过引用隐式或显式捕获实体,则在实体的生命周期结束后调用相应lambda-expression的函数调用运算符可能会导致未定义   行为。 -end note ]

答案 1 :(得分:5)

  

自动的寿命是否延长到lambda函数的寿命?

没有。 lambda可能在这里令人困惑,所以让我们把它重写成一个结构:

struct X
{
    int operator()() const { return ref++; }

    int& ref;
};

auto genfunc (int start)
{
    int count=start;
    return X{count};
}

我们创建的X对象将一个引用(ref)保存到一个临时(count),该对象在返回对象后立即超出范围。 lambda没有什么特别之处 - 悬挂参考是一个悬垂的参考。

没有理由保留引用,只是捕获按值:

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

请注意所需的mutable关键字。