Проблема с передачей ссылкой

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

Например, когда я пытаюсь сделать это:

void function(double a);
void function(double &a);

Я хотел бы, чтобы вызывающая сторона этой функции смогла сделать:

double a = 2.5;
function(a); // should call function(double &a)
function(2.3); // should call function(double a)

Я хотел бы записать функции передачи ссылкой для лучшего использования памяти и возможного управления переменной за пределами объема, но не имея необходимость создавать новую переменную именно так я могу вызвать функцию.

Действительно ли это возможно?

Удачи

7
задан Simon Walker 12 July 2010 в 10:05
поделиться

6 ответов

Мне кажется, вы упускаете суть. На самом деле нужно сделать вот так:

void function(const double &a);

Обратите внимание на "const". С ним вы всегда должны получать передачу по ссылке. Если у вас не const передача по ссылке, то компилятор будет правильно считать, что вы хотите изменить переданный объект - что, конечно, концептуально несовместимо с вариантом передачи по значению.

При const-ссылках компилятор с радостью создаст временный объект за вашей спиной. Версия без const не работает, потому что компилятор может создавать эти временные объекты только как "const" объекты.

9
ответ дан 7 December 2019 в 01:15
поделиться

Я попробовал, но ничего не вышло

По крайней мере, в MSVC2008 это невозможно - и я думаю, что это применимо ко всем компиляторам c ++.

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

function(a);

с переменной в качестве параметра возникает ошибка компилятора, поскольку компилятор не может решить, какую функцию использовать.

1
ответ дан 7 December 2019 в 01:15
поделиться
void function(double const &a);  // instead of void function(double a);
void function(double       &a); 
1
ответ дан 7 December 2019 в 01:15
поделиться

Нет, так делать нельзя, потому что обе функции будут выдавать одинаковые искаженные имена, и компоновщик не сможет разрешить вызов функции.

-1
ответ дан 7 December 2019 в 01:15
поделиться

Я не думаю, что определение:

void function(double a);
void function(double &a);

возможно ... Как компилятор узнает, какую функцию вызывать для function (x) ? Если вы хотите использовать как по ссылке, так и по значению, вам следует использовать две разные функции. Это также сделало бы код намного более читаемым, чем эта неоднозначная перегрузка.

0
ответ дан 7 December 2019 в 01:15
поделиться

Нет никакой пользы от передачи POD-типов по ссылке, так как они почти всегда (всегда?) передаются в реестре. Сложные типы (состоящие из более чем одной POD-переменной), передаваемые по const-ссылке, обычно (всегда?:D) предпочтительнее, чем копирование и проталкивание стека. Вы даже можете контролировать создание временных переменных ваших сложных типов из POD-типов, создавая явные конструкторы

0
ответ дан 7 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: