无法将类型的非常量左值引用绑定到类型的右值

时间:2019-01-27 05:35:03

标签: c++ c++11 c++14

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;
}

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

我该如何解决?

1 个答案:

答案 0 :(得分:2)

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,RValues是不可修改的常量,因此不允许您将它们用作可变的引用参数。

修复很简单,因为Create_moneys()不会修改指针,因此没有理由通过引用接受其参数,只需将其声明为Create_moneys(shared_ptr<CoinMoney>* ms)