在这种情况下,C++ "Initial value of reference to a non-const must be an lvalue" 的错误意味着什么?

C++ what does the error of "Initial value of reference to a non-const must be an lvalue" mean in this case?

我是 C++ 的完全初学者,被分配编写一个 returns 数字因数的函数。下面,我包含了我也创建的名为 print_vector 的函数,它将把矢量的所有元素打印到控制台。

在我的作业中,为了检查 factorize 函数是否正常工作,我们必须使用提供的 test_factorize 函数,我也包含了该函数。但是,我 运行 遇到的问题是给定的 test_factorize 由于错误“Initial value of reference to a non-const must be an lvalue”而无法工作。我不确定这意味着什么以及为什么 test_factorize 运行 会出现问题,因为 factorize 的输出是一个向量而 print_vector 的输入也是一个向量,所以我不明白为什么 test_factorize 的内容会导致错误,尽管我怀疑它可能是我定义的“factorize”函数中的某些东西导致了这个错误。

#include <iostream>
#include <vector>

using namespace std;

void print_vector(std::vector<int>& v) {
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
}

std::vector<int> factorize(int n) {
    std::vector<int> answer;
    for (int i = 1;i < n + 1; ++i) {
        if (n % i == 0) {
            answer.push_back(i);
        }
    }
    return answer;
}

void test_factorize() {
print_vector(factorize(2));
print_vector(factorize(72));
print_vector(factorize(196));
}

错误来自这一行:

void print_vector(std::vector<int>& v) {

由于您没有在参数类型中包含 const 关键字,因此您(隐含地)表明 print_vector 有权修改 v 的内容。

但是,您调用 print_vector() 时使用临时对象(factorize() 返回的向量)作为参数,而 C++ 不允许您通过非常量传递临时对象参考,大概是基于对临时对象进行更改是没有意义的理论(因为临时对象将在函数调用 returns 后立即被销毁,因此对其进行的任何更改都将无效)因此必须程序员错误。

无论如何,修复很简单,只需将您的函数声明更改为:

void print_vector(const std::vector<int>& v) {

...这将允许您向它传递一个临时向量的引用。