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对象才会被销毁
常见疑问答复
- 会不会因为悬垂引用导致未定义行为?在你给出的用法场景下不会,整个调用链路中临时对象始终存活。
- 字面量
5的临时对象会不会在f被调用前销毁?不会,临时对象的生命周期覆盖整个完整表达式的执行,f调用属于表达式内部的执行步骤,调用时临时对象仍然有效。 - 临时变量的销毁时机:等
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
相关产品推荐
相关产品推荐

