通过传入的引用捕获从函数返回lambda

时间:2017-01-30 14:25:14

标签: c++ lambda

返回像这样的lambda是否安全:

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

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

1 个答案:

答案 0 :(得分:4)

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

对于doIt(const Object& obj)可以绑定临时对象这一事实而言,这可能不是一个好主意。想象一下:

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

那是因为临时返回的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。