не удается передать по ссылке указатель, возвращенный из функции

#c #c 98

#c #c 98

Вопрос:

зачем мне нужна промежуточная переменная для передачи моего возвращаемого указателя по ссылке вместо того, чтобы просто использовать функцию, которая возвращает этот указатель?

Это не компилируется

 int main ()
{
  testfunc(getpointer());
  return 0;
} 
  

ошибка: C2664: ‘void testfunc(int *amp;)’: не удается преобразовать аргумент 1 из ‘int *’ в ‘int *amp;’

и это компилирует

 int main ()
{
   int *i = getpointer();
   testfunc(i);
   return 0; 
} 
  

мои две функции

 void testfunc(int *amp; i) // I have to use this interface
{
  cout << i[0] <<endl;
}

int* getpointer()
{
  int * arr1 = new int[1];
  arr1[0]=10;
  return arr1;
}
  

Комментарии:

1. Потому что это временный объект.

2. правильно! но почему этот временный объект не может быть передан в testfunc ? у него все еще есть адрес, и к нему можно получить доступ? верно? или я что-то пропустил?

3. @DavidSchwartz когда этот адрес будет уничтожен? Я предполагал, что по крайней мере адрес будет передан в testfunc .. почему бы и нет?

4. @H.G Верно, так что произойдет с любыми изменениями testfunc , внесенными в него? Помните, testfunc принимает неконстантную ссылку. Исправлено testfunc , чтобы быть корректным.

5. Во втором примере вы принимаете постоянный указатель, а не постоянную ссылку.

Ответ №1:

Язык C запрещает привязку неконстантной ссылки к временной. В этом случае простое исправление состоит в том, чтобы заставить testfunc принимать постоянную ссылку на an int* .

Комментарии:

1. Я не могу это контролировать .. testfunc находится в сторонней библиотеке

2. @H.G Тогда вам придется использовать какой-нибудь уродливый хак с копией временного или приведения или что-то в этом роде. Но поймите, что testfunc это не работает.

3. правильно! … testfunc(int * const amp; i) работал нормально .. к сожалению, я не могу изменить этот testfunc в моем реальном коде.. но, по крайней мере, теперь я вижу проблему!

4. @H.G Теоретически, да. Но на практике это, вероятно, будет отлично работать на любой платформе, с которой вы, вероятно, столкнетесь. У вас есть выбор ужасных обходных путей, и, IMO, это один из самых ужасных.

5. @H.G: Обновить. 🙂 Но на самом деле, нет. Возьмите комбинацию этих двух и сделайте ее новой функцией : void dothething() { int* x = getpointer(); testfunc(x); } .