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

C++ vector<vector<int>>传参类型不匹配报错原因咨询

矩阵快速幂代码编译错误原因说明

初始代码与报错现象

实现矩阵求幂功能的初始代码如下:

long long mod = (1e+9)+7;

vector<vector<int>> matrixMultiply(vector<vector<int>>& A, vector<vector<int>>& B){
    vector<vector<int>> ans(2, vector<int> (2));
    for(int i = 0; i < 2; ++i)
        for(int j = 0; j < 2; ++j)
            for(int k = 0; k < 2; ++k){
                ans[i][j] += ((A[i][k]%mod) * (A[k][j]%mod))%mod;
                ans[i][j] = ans[i][j]%mod;
            }
    return ans;
}

vector<vector<int>> matrixPower(int n, vector<vector<int>>& M){
    if(n==1) {
        return M;
    }
    vector<vector<int>> temp = matrixPower(n/2,M);
    if(n%2==0){
        return matrixMultiply(temp,temp);
    }
    else{
        return matrixMultiply(matrixMultiply(temp,temp),M);
    }
}

int solve(int A){
    vector< vector<int>> M{{1,1},{1,0}};
    vector< vector<int>> Mpower = matrixPower(A-1,M);
    return Mpower[0][0];
}

int main(){
    cout << solve(4);
    return 0;
}

编译时触发的核心错误信息:

error: invalid initialization of non-const reference of type 'std::vector<std::vector >&' from an rvalue of type 'std::vector<std::vector >'
对应出错行:return matrixMultiply(matrixMultiply(temp,temp),M);

调整matrixPower实现后代码可正常编译运行,修改后的代码段:

vector<vector<int>> matrixPower(int n, vector<vector<int>>& M){
    if(n==1) {
        return M;
    }
    vector<vector<int>> temp = matrixPower(n/2,M);
    vector<vector<int>> multiplied_matrix = matrixMultiply(temp,temp);
    if(n%2==0){
        return multiplied_matrix;
    }
    else{
        return matrixMultiply(multiplied_matrix,M);
    }
}

报错根本原因

C++有明确的引用绑定规则:
非const修饰的左值引用(即代码中定义的vector<vector<int>>&类型形参)只能绑定到有明确内存身份、可被取地址的左值,不能绑定到临时生成的右值对象。
函数按值返回的对象属于临时右值,如果表达式执行过程中没有被具名变量接收,就没有持久的内存身份,无法被非const左值引用绑定。

初始代码的出错行中,内层调用matrixMultiply(temp,temp)的返回值是临时生成的二维vector,属于典型的右值。直接把这个临时对象作为参数传给外层matrixMultiply的第一个非const左值引用形参,违反了上述绑定规则,因此编译器抛出错误。

两段代码的本质差异

两段代码的核心区别在于传给matrixMultiply的参数类型不同:

  • 初始错误写法:直接把函数返回的临时右值作为引用参数传入,不符合非const左值引用的绑定要求。
  • 修改后的正确写法:先把matrixMultiply(temp,temp)的返回值赋值给带变量名的局部变量multiplied_matrix,这个局部变量是存储在栈上、有明确内存地址的左值,再把它作为参数传给matrixMultiply时,符合非const左值引用的绑定规则,因此可以正常编译。

补充优化提示:matrixMultiply函数逻辑上不会修改输入的A、B矩阵,更规范的写法是给形参加const修饰,写成vector<vector<int>> matrixMultiply(const vector<vector<int>>& A, const vector<vector<int>>& B)。const左值引用支持绑定临时右值,这种写法下就算直接传临时返回值也不会触发编译错误,还能避免意外修改输入参数的问题。另外当前矩阵乘法实现有逻辑错误,内层计算时应该取B[k][j]而不是A[k][j],修正后计算结果才会正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:31:02