C++中返回临时参数:恒等函数的临时变量生命周期延长问题
关于C++中identity函数延长临时对象生命周期的可行方案
首先明确:直接用const std::string& x = f();(或std::string&& x = f();)时,f()返回的临时对象生命周期会被延长至引用x离开作用域。但如果通过identity函数透传,默认实现会打破这个生命周期绑定——除非你按以下方式重载identity:
核心实现思路
利用C++的引用折叠规则和完美转发,让identity返回与输入参数完全匹配的引用类型,确保返回的引用直接绑定到原始临时对象,而非新的中间对象。
重载实现
提供两个模板重载,分别处理左值和右值:
1. 处理右值临时对象(对应f()返回临时值的场景)
#include <utility> template<typename T> T&& identity(T&& val) { return std::forward<T>(val); }
通过std::forward<T>完美转发参数,返回的右值引用会直接绑定到f()生成的临时对象。此时:
const std::string& x = identity(f()); // 临时对象生命周期延长至x的作用域结束 std::string&& y = identity(f()); // 同样生效,右值引用直接绑定临时对象
2. 处理左值引用(透传已有对象的引用)
template<typename T> T& identity(T& val) { return val; }
这个版本用于透传左值,不会改变原有对象的生命周期,比如:
std::string s = "example"; std::string& z = identity(s); // z直接绑定s,生命周期与s一致
关键注意事项
- 绝对不能让
identity按值返回(比如template<typename T> T identity(T val)),否则会创建新的临时对象,原始临时对象会在identity调用结束后立即销毁。 - 非const左值引用无法绑定临时对象,所以原始场景中的
std::string& x = f();本身不符合C++标准,正确写法应为const std::string&或std::string&&。
内容的提问来源于stack exchange,提问作者Cort Ammon
相关产品推荐
相关产品推荐

