用auto&&绑定lambda是否安全?其生命周期能否延长至引用生命周期?
使用auto&&绑定Lambda是否安全?
是安全的,lambda的生命周期会被延长至转发引用的生命周期。
原因:
- lambda表达式属于prvalue(纯右值),当用
auto&&直接绑定它时,auto&&会被推导为右值引用。 - 根据C++标准,当右值引用直接绑定到临时对象时,临时对象的生命周期会被延长,与引用的生命周期保持一致。lambda表达式生成的临时闭包对象就属于这类临时对象,且这里是直接绑定,没有任何中间转换或额外操作,完全符合生命周期延长的条件。
代码示例:
#include <iostream> int main() { // 直接用auto&&绑定lambda表达式 auto&& fn = []() { std::cout << "Lambda闭包对象存活,调用成功\n"; }; fn(); // 安全调用,闭包对象仍处于存活状态 return 0; }
注意点:
只有当auto&&直接绑定到lambda表达式本身(prvalue)时才会触发生命周期延长。如果绑定的是lambda的左值引用(比如auto&& fn = existing_lambda;,其中existing_lambda是一个具名的lambda对象),则不会触发生命周期延长,此时需要确保原lambda对象的生命周期长于引用。
内容的提问来源于stack exchange,提问作者Alexander Torstling
相关产品推荐
相关产品推荐

