从函数返回 lambda 并传入引用捕获

Returning lambda from function with passed in reference capture

本文关键字:引用 函数 返回 lambda      更新时间:2023-10-16

这样返回 lambda 是否安全:

auto doIt(const Object& obj) {
    return [&obj]{ obj.doIt();};
}

它使用本地捕获返回 lambda,但引用是传递到函数中的引用,而不是从局部变量传递的引用。

auto doIt(const Object& obj) {
    return [&obj]{ obj.doIt();};
}
这可能

不是一个好主意,因为doIt(const Object& obj)可以绑定临时对象。想象一下:

auto lm = doIt(make_object());
lm();                                 //Undefined behavior

这是因为临时返回的 my make_object 将在函数doIt结束时被销毁,但您返回的 lambda 仍然包含对已销毁对象的引用。

另一个例子是:

auto func(){
    Object obj = make_object();
    auto lm = doIt(obj);
    lm();                            //This is Ok
    return lm;
}
void something{
    auto val = func();
    val();                           //Undefined Behavior
}

编辑:请参阅评论

您可以添加void doIt(const Object&&) = delete;重载以防止临时重载;由@StoryTeller提供。