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

为何将右值传递给左值引用在该场景下可行?

为何将右值传递给左值引用在该场景下可行?

嗨,这个问题抓得很准!你发现的这个看似“违规”的写法,其实是利用了C++中赋值表达式的一个关键特性,咱们来慢慢拆解清楚:

首先得明确一个基础规则:通常情况下,非const的左值引用(比如你的std::vector<int>&)是不能直接绑定右值的——比如你要是直接写print(std::vector<int>{1,2,3,4,5}),编译器肯定会报错,因为临时的vector对象是右值,没法直接传给左值引用参数。

但你的代码里不是直接传右值,而是传了一个赋值表达式的结果,这就是关键!

在C++标准里,赋值运算符=的返回值是一个左值引用,指向被赋值的对象。咱们看你的代码:
std::vector<int>(5) = {1,2,3,4,5}
这个表达式的执行步骤是:

  1. 先创建一个临时的vector对象(std::vector<int>(5)),这是个右值;
  2. 对这个临时对象执行赋值操作,把{1,2,3,4,5}的元素赋值进去;
  3. 赋值表达式返回这个临时对象的左值引用——也就是说,整个表达式的结果是一个左值,而非右值。

这时候,把这个左值传给print函数的std::vector<int>&参数就完全合法了!而且C++会自动延长这个临时对象的生命周期,直到print函数执行完毕,所以你在函数里打印元素的时候不会出现悬空引用的问题。

简单总结几点:

  • 赋值表达式的结果是左值引用,完美匹配左值引用参数的要求;
  • 临时对象的生命周期会被延长到函数调用结束,保证了操作的安全性;
  • 这是C++标准明确规定的行为,不是编译器的“特殊照顾”。

备注:内容来源于stack exchange,提问作者Aik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:07:59