#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); }
.