如果自动绑定到lambda函数,自动的生命是否延长到lambda函数的生命周期?
最简单的情况:
auto genfunc (int start)
{
int count=start;
return [&count] {
return count++;
};
}
这是好的还是未定义的行为?
答案 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
关键字。