Можно ли сделать «вызов по ссылке, когда это возможно» в C ++? - PullRequest
1 голос
/ 18 апреля 2020

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

Например, у меня есть функции fooCallByValue(myObj x) и fooCallByReference(myObj& x). Они имеют идентичную реализацию, но я действительно wi sh, чтобы использовать вызов по ссылке, когда это возможно, по какой-то причине. В настоящее время я должен вручную выбрать, какую функцию вызывать. Просто наличие двух функций с одинаковым именем (например, foo(myObj x) и foo(myObj& x)) приведет к ошибке (Использование шаблона также не помогает).

Пример problemmati c код:

class myObj {
public:
myObj(myObj& obj) {
    // implementation...
}
myObj& operator = (myObj& obj) {
    // implementation...
}

myObj operator + (myObj& obj) {
    // implementation...
}
  // other members and implementation...

   someObj* pointer;
};


void foo(myObj& x) {
    cout << "call by reference" << endl;
}

void foo(myObj x) {
    cout << "call by value" << endl;
}

int main() {
    myObj x, y;

    //init x and y...

    foo(x);
    foo(x + y);
}

Желаемый вывод:

call by reference
call by value

Заранее спасибо.

Редактирование:

  1. По какой-то особой причине operator + собирается изменить ввод myObj& x, чтобы он не принимал константу.

Да, желательно изменить исходный ввод, когда это возможно. В противном случае он выполнит «копирование» и изменит скопированное значение.

Больше фонов:

Этот myObj содержит указатель. Поэтому мне нужно сделать глубокую копию в конструкторе копирования. Но я не хочу этого делать при передаче значений между функциями, когда это возможно.

1 Ответ

1 голос
/ 18 апреля 2020

Я думаю, вы хотите различить guish между значениями r и l. Вы можете сделать это с этими перегрузками.

void foo(myObj& x) {
    cout << "call by l-value" << endl;
}

void foo(myObj&& x) {
    cout << "call by r-value" << endl;
}

Вот демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...