getData()
возвращает значение. Вы не можете взять ссылку на указатель rvalue.
У вас есть два варианта:
1) Pass fnc()
lvalues:
int* lhs = one.getData_();
int* rhs = two.getData_();
fnc(lhs, rhs);
2) Или, поскольку вы передаете ссылки на указатели, которые на самом деле имеют тот же размер, что и сами указатели, почему бы просто не передать указатели?
void fnc(int* left, int* right )
{
int* tmp = left;
left = right;
right = tmp;
}
EDIT:
Еще немного о lvalues и rvalues. «lvalue» используется для обозначения «выражения, которое может находиться слева от операции =
». Фактически, rvalue было обратным: rvalue было любым выражением, которое не могло быть слева от операции =
.
Сейчас все немного сложнее, но это все же довольно хороший способ понять lvalues и rvalues.
Теперь рассмотрим следующий код:
int val()
{
return 42;
}
int main()
{
int* p = &val();
}
val()
возвращает int
по значению - другими словами, он возвращает неназванное временное значение. Должны ли вы быть в состоянии взять адрес этого временного?
Вы можете подумать: "Ну, да, а почему бы и нет?" Но ответ на самом деле нет, вы не можете взять адрес временного. Причина в том, что время жизни этого временного. Его область действия ограничена выражением, в котором он был создан. Другими словами: val()
. Как только val()
был полностью оценен, временное прекращение существования. По сути, он падает со стека. К моменту оценки int* p = &
временное значение давно исчезло. Там ничего не осталось взять адрес.
Это в основном то, почему вы не можете получить адрес rvalue, поэтому, по расширению, вы не можете получить ссылку на адрес rvalue.