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