не может связать неконстантную ссылку lvalue типа с rvalue типа - PullRequest
0 голосов
/ 27 января 2019
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;
}

Я получаю эту ошибку "не могу связать неконстантную ссылку lvalue типа ~ с rvalue типа

Как это исправить?

1 Ответ

0 голосов
/ 27 января 2019

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).

...