Разве разыменовывает указатель и передает его функции, которая принимает свой аргумент по ссылке, создает копию объекта?
Разве разыменование указателя делает его копию?
Ответ 1
В этом случае значение в указателе копируется (хотя это не обязательно так, как оптимизатор может его оптимизировать).
int val = *pPtr;
В этом случае, однако, копия не будет выполнена:
int& rVal = *pPtr;
Причина отсутствия копии заключается в том, что ссылка не является конструкцией уровня машинного кода. Это конструкция более высокого уровня и, следовательно, это то, что компилятор использует внутри, а не генерирует для него определенный код.
То же самое, очевидно, относится к параметрам функции.
Ответ 2
В простом случае нет. Однако есть более сложные случаи:
void foo(float const& arg);
int * p = new int(7);
foo(*p);
Здесь создается временный объект, поскольку тип разыменованного указателя (int
) не соответствует базовому типу параметра функции (float
). Существует последовательность преобразования, и преобразованное временное может быть привязано к arg
, поскольку это константная ссылка.
Ответ 3
Надеюсь, это не так: если бы вызываемая функция приняла свой аргумент по значению.
Кроме того, что ожидаемое поведение ссылки:
void inc(int &i) { ++i; }
int main()
{
int i = 0;
int *j = &i;
inc(*j);
std::cout << i << std::endl;
}
Этот код должен печатать 1
, потому что inc
принимает свой аргумент по ссылке. Если бы была сделана копия по вызову inc
, код напечатал бы 0
.
Ответ 4
Нет. Ссылка более или менее похожа на указатель с разными обозначениями и ограничение на отсутствие нулевой ссылки. Но, как указатель, он содержит только адрес объекта.