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

C++非const int&引用参数传入右值为何触发编译错误?

C++ 非const引用绑定右值编译错误原因解析

核心原因

C++语法明确规定:非常量左值引用(int&属于这类)只能绑定到有明确内存地址、生命周期持久的左值,禁止绑定到临时生成的右值。

问题拆解

基础概念说明

  • 左值:可以通过&运算符取地址的对象,比如你代码里定义的int idx = 0中的idx、int sum = 0中的sum都属于左值
  • 右值:临时生成的、运算结束后会立刻销毁的临时值,没有持久的内存地址,比如算术表达式的运算结果、字面量都属于右值

代码报错点定位

你代码中递归调用func时的入参存在多处右值传递,不符合非常量引用的绑定规则:

  1. 两次递归调用的第一个入参都是idx + 1,属于算术运算生成的临时int值,是右值,无法匹配int& idx形参
  2. 选择元素的递归分支中,第二个入参是sum + arr[idx],同样是算术运算生成的临时右值,无法匹配int& sum形参

为什么去掉引用就正常

去掉&修饰后,idx和sum形参变为值传递:会把传入的右值拷贝一份给形参使用,不需要做引用绑定,自然不会触发语法报错。

补充说明

你的递归逻辑本身就适合用值传递:每个递归分支的idx和sum都是当前分支独立的状态,不需要修改父调用层的对应变量,如果强行使用引用反而会导致分支状态互相干扰,出现逻辑错误。如果确实需要保留引用修饰,需要先将右值赋值给本地左值变量再传递,示例如下:

// pick the element
int new_idx = idx + 1;
int new_sum = sum + arr[idx];
func(new_idx, new_sum, arr, N, res);

// not pick the element
int new_idx2 = idx + 1;
func(new_idx2, sum, arr, N, res);

但这种写法在当前场景下没有必要,反而增加冗余代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:45:02