Проблема с передачей по ссылке - PullRequest
7 голосов
/ 12 июля 2010

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

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

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)

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

Возможно ли это?

Приветствия

Ответы [ 6 ]

8 голосов
/ 12 июля 2010

Я думаю, что вы здесь упускаете смысл. То, что вы действительно должны иметь, это просто:

void function(const double &a);

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

С помощью константных ссылок компилятор с радостью создаст для вас временный объект за вашей спиной. Неконстантная версия не работает для вас, потому что компилятор может создавать эти временные объекты только как «константные» объекты.

1 голос
/ 12 июля 2010
void function(double const &a);  // instead of void function(double a);
void function(double       &a); 
1 голос
/ 12 июля 2010

Я попробовал, и это не удалось

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

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

function(a);

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

0 голосов
/ 12 июля 2010

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

0 голосов
/ 12 июля 2010

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

0 голосов
/ 12 июля 2010

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

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

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

...