返回像这样的lambda是否安全:
auto doIt(const Object& obj) {
return [&obj]{ obj.doIt();};
}
它使用本地捕获返回lambda,但引用是传递给函数而不是本地变量的引用。
答案 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。