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

Gle*_*aum 1 c++ lambda c++11 c++14

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

最简单的情况:

auto genfunc (int start)
{
     int count=start;
     return [&count] {
         return count++;
     };
}
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*ian 6

不,count因为您通过引用捕获它,所以不会延长生命周期.终身扩展规则§12.2[class.temporary],第4和第5项中列出,并且都不包括lambda中的引用捕获.

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

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


Bar*_*rry 5

自动生命延长到lambda函数的生命吗?

不.这里的lambda可能会令人困惑,所以让我们把它重写成一个结构:

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

    int& ref;
};

auto genfunc (int start)
{
    int count=start;
    return X{count};
}
Run Code Online (Sandbox Code Playgroud)

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

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

auto genfunc (int start)
{
     return [start]() mutable {
         return start++;
     };
}
Run Code Online (Sandbox Code Playgroud)

请注意所需的mutable关键字.