You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++模板返回值实现:decltype(auto)/auto&&?返回int&&是否安全

关于get_object模板函数的返回值安全与生命周期问题

需求与原实现问题

我想要实现一个get_object模板函数,满足:

  • 调用get_object(Foo())时返回int
  • 调用get_object(Foo实例)时返回int&

原实现无法满足需求:

template<typename T>
decltype(auto) get_object(T&& a) {
   return a.object;
}

参考std::get的实现会为const&、&、&&分别提供重载,但我想找更简洁的实现方式。修改后得到两种可行版本:

template<typename T>
decltype(auto) get_object(T&& a) {
   return (std::forward<T>(a).object);
}
// 或:
template<typename T>
auto&& get_object(T&& a) {
   return std::forward<T>(a).object;
}

这两种实现能让get_object(Foo())返回int&&,get_object(Foo实例)返回int&。但我核心疑问是:返回int&&是否安全?其生命周期是否会被延长?

解答

返回int&&的安全性

返回int&&不安全,绑定到临时对象成员的右值引用不会延长临时对象的生命周期。

当调用get_object(Foo())时,Foo()是临时对象,它的生命周期仅到完整表达式结束(即get_object调用语句执行完毕时)。临时Foo对象销毁时,其内部的object成员也会被销毁,此时返回的int&&会变成悬垂引用,后续使用会触发未定义行为。

实现原需求的正确方式(返回int而非int&&)

要满足左值实例调用返回int&、临时对象调用返回int值的需求,可通过简洁的重载区分左值和右值参数:

// 处理左值参数,返回引用
template<typename T>
int& get_object(T& a) {
    return a.object;
}

// 处理右值参数,返回值
template<typename T>
int get_object(T&& a) {
    return a.object;
}

这种方式逻辑清晰,直接匹配左值/右值参数,既避免了悬垂引用问题,又完全符合最初的需求。


内容的提问来源于stack exchange,提问作者user2561762

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:20:41