不能将类型的非常量左值引用绑定到类型的右值

cannot bind non-const lvalue reference of type to an rvalue of type

本文关键字:类型 引用 绑定 常量 非常 不能      更新时间:2023-10-16
void Create_moneys(shared_ptr<CoinMoney>* &ms){
    int max = getSize(true);
    for(size_t i = 0; i < max; ++i){
        cout << "ms is : " <<typeid(ms[i]).name() << endl;
        ms[i] = make_shared<CoinMoney>();
        ms[i]->c50 = i+1;
        ms[i]->c100 = i+2;
        ms[i]->c500 = i+3;
    }
}
int main(int argc, char* argv[]){
    shared_ptr<CoinMoney> pm1[getSize(true)];
    Create_moneys(pm1); // error
    for(auto p : pm1)
        CoinMoney_Print(*p);
    return 0;
}

我收到此错误"无法将类型的非常量左值引用 ~ 绑定到类型的右值

我该如何解决这个问题?

Create_moneys()是一个函数,它接受对指针的可变引用。

这意味着函数在

技术上可以以传播到调用方的方式修改指针本身。

例如:

int global_x;
void foo(int*& ptr) {
  ptr = &global_x;
}
void bar() {
  int local_x;
  int * local_ptr = &local_x;
  foo(local_ptr);
  //local_ptr now points to global_x!
}

现在,pm1是一个数组,当您调用Create_moneys(pm1);时,语言会创建一个指向数组开头的临时指针。该临时值称为 RValue,RValue 是不可修改的常量,因此不允许将它们用作可变引用参数。

修复很简单,因为Create_moneys()不修改指针,它没有理由通过引用来获取其参数,只需将其声明为 Create_moneys(shared_ptr<CoinMoney>* ms) 即可。