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

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

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

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

ошибка: C2664: 'void testfunc (int *&)': невозможно преобразовать аргумент 1 из 'int *' в 'int *&'

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

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

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

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

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

person HazemGomaa    schedule 05.10.2016    source источник
comment
Потому что это временный объект.   -  person barak manos    schedule 06.10.2016
comment
правильно ! но почему этот временный объект не может быть передан в testfunc? у него все еще есть адрес и к нему можно получить доступ? правильно ? или я что-то пропустил?   -  person HazemGomaa    schedule 06.10.2016
comment
@DavidSchwartz, когда этот адрес будет уничтожен? Я предполагал, что, по крайней мере, адрес будет передан в testfunc... почему бы и нет?   -  person HazemGomaa    schedule 06.10.2016
comment
@ H.G Хорошо, так что же произойдет с любыми изменениями, которые testfunc внес в него? Помните, что testfunc принимает неконстантную ссылку. Исправьте testfunc, чтобы он был корректным.   -  person David Schwartz    schedule 06.10.2016
comment
Во втором примере вы принимаете указатель const, а не ссылку const.   -  person Galik    schedule 06.10.2016
comment
@Galik правильно, я понял это, и теперь это работает с testfunc (int * const & i)   -  person HazemGomaa    schedule 06.10.2016


Ответы (1)


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

person David Schwartz    schedule 05.10.2016
comment
Я не могу это контролировать.. testfunc находится в сторонней библиотеке - person HazemGomaa; 06.10.2016
comment
@H.G Тогда вам придется использовать какой-нибудь уродливый хак с копией временного файла, или приведения, или что-то в этом роде. Но поймите, что testfunc сломан. - person David Schwartz; 06.10.2016
comment
правильно ! ... testfunc(int * const & i) работал нормально .. к сожалению, я не могу изменить этот testfunc в моем реальном коде .. но, по крайней мере, теперь я вижу проблему! - person HazemGomaa; 06.10.2016
comment
Я попробовал это на своем примере, и он работает нормально... я ожидаю случайного неопределенного поведения? - person HazemGomaa; 06.10.2016
comment
@HG Теоретически да. Но на практике он, вероятно, будет отлично работать на каждой платформе, с которой вы, вероятно, столкнетесь. У вас есть выбор ужасных обходных путей, и, ИМО, это один из самых ужасных. - person David Schwartz; 06.10.2016
comment
@H.G: C++ имеет перегрузку. Просто напишите void testfunc(int*&& x) {testfunc(x);} - person GManNickG; 06.10.2016
comment
@GManNickG работает на С++ 11, но я на С++ 98 ... есть идеи? - person HazemGomaa; 06.10.2016
comment
@HG: Обновить. :) Но на самом деле нет. Возьмите комбинацию этих двух и создайте новую функцию: void dothething() { int* x = getpointer(); testfunc(x); }. - person GManNickG; 06.10.2016
comment
@GManNickG :) LOL, это имеет смысл! - person HazemGomaa; 06.10.2016