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

C++中将r值通过非const引用传递是否存在未定义行为?

问题结论

你提供的这段代码不存在未定义行为,不会触发悬垂引用问题。

核心规则说明

C++标准明确规定:当临时对象作为函数调用的实参时,其生命周期会持续到包含该函数调用的完整表达式执行结束。

你示例中的核心执行语句auto y = f(to_l_value(5));是一个完整表达式,字面量5生成的int类型临时对象,生命周期会覆盖整个表达式的执行过程。

调用过程拆解
  • 第一步生成int类型临时对象存储值5,绑定到to_l_value的万能引用参数auto&& x
  • to_l_value返回左值引用指向该临时对象,引用本身有效,此时临时对象仍处于存活状态
  • 该左值引用传入f,执行x +=5的修改操作,整个调用过程中临时对象都不会被销毁
  • 函数返回值完成对y的初始化后,整个完整表达式执行结束,临时int对象才会被销毁
常见疑问答复
  1. 会不会因为悬垂引用导致未定义行为?在你给出的用法场景下不会,整个调用链路中临时对象始终存活。
  2. 字面量5的临时对象会不会在f被调用前销毁?不会,临时对象的生命周期覆盖整个完整表达式的执行,f调用属于表达式内部的执行步骤,调用时临时对象仍然有效。
  3. 临时变量的销毁时机:等auto y = f(to_l_value(5));整行执行完毕、y完成初始化之后,该临时对象才会被销毁。
注意事项

这种to_l_value的用法仅在「单次完整表达式内使用返回的引用」时安全,如果你将to_l_value的返回值保存为独立的引用变量,超出表达式范围后再访问就会触发悬垂引用的未定义行为,错误示例如下:

// 错误用法,触发未定义行为
int& bad_ref = to_l_value(5);
std::cout << bad_ref; // 临时对象已经销毁,bad_ref为悬垂引用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:18:03