【问题标题】:cannot bind non-const lvalue reference of type to an rvalue of type无法将类型的非 const 左值引用绑定到类型的右值
【发布时间】:2019-01-27 05:35:03
【问题描述】:
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() 接受对指针的引用?这不像你在修改它......
  • "auto& ms" 可能,但 "shared_ptr* ms" 是不可能的 我不明白这个

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


【解决方案1】:

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&lt;CoinMoney&gt;* ms)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-07
    • 2018-08-22
    • 2021-03-03
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多