函数模板返回局部变量未用引用却正常:存在生命周期延长吗?
问题解答
这段代码里不存在生命周期延长的场景,之所以没报错还能正常运行,是因为你混淆了返回局部变量的两种不同情况:
先理清代码执行逻辑:
foo返回的是一个lambda对象,这个lambda不会立刻执行内部代码,只有当你调用这个lambda的时候,里面的逻辑才会触发。
当lambda被调用时,确实创建了局部变量result,但return result;返回的是result的值拷贝——std::vector本身支持拷贝构造,编译器会生成一个全新的vector对象,把result的内容完整复制进去,这个新对象会被返回给lambda的调用者。为什么没出现你担心的错误:
你之前以为返回局部变量会出错,是把返回局部变量的引用/指针和返回局部变量的值搞混了。只有当返回的是std::vector<double>&(引用)或者指向result的指针时,才会出问题——因为局部变量销毁后,引用/指针就指向了已经释放的内存。但这里返回的是值类型,拷贝操作已经把数据转移到了新对象里,局部变量result销毁不会影响返回的新对象。
内容的提问来源于stack exchange,提问作者terto
相关产品推荐
相关产品推荐

