在 C++ 中可以做 "call by reference when possible" 吗?

Is it possible to do "call by reference when possible" in C++?

是否可以要求编译器尽可能使用函数的 "call-by-reference" 版本?我希望尽可能避免"copy"

例如,我有一个函数fooCallByValue(myObj x)fooCallByReference(myObj& x)。它们具有相同的实现,但出于某种原因,我真的希望尽可能使用按引用调用。目前我必须手动选择要调用的函数。简单地使用两个具有相同名称的函数(例如 foo(myObj x)foo(myObj& x))将导致错误(使用模板也无济于事)。

示例有问题的代码:

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 因此它不接受常量。

是的,希望尽可能修改原始输入。否则它将执行 "copy" 并修改复制的值。

  1. 更多背景:

这个myObj包含一个指针。因此我需要在复制构造函数中做一个深层复制。但是我不想在可能的情况下在函数之间传递值时这样做。

我想你的意思是区分右值和左值。您可以使用这些重载来做到这一点。

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

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

这是一个demo