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



如果可能,是否可以要求编译器使用函数的"引用调用"版本?我希望尽可能避免"复制">

例如,我有一个函数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,使其不接受常数

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

  1. 更多背景:

myObj包含一个指针。因此,我需要在副本构造函数中进行深度复制。但我不想在可能的情况下在函数之间传递值。

我认为您的意思是区分r值和l值。你可以用这些重载来做到这一点。

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

这是的演示

最新更新