在 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
提前致谢。
编辑:
- 由于某些特殊原因
operator +
将修改输入 myObj& x
因此它不接受常量。
是的,希望尽可能修改原始输入。否则它将执行 "copy" 并修改复制的值。
- 更多背景:
这个myObj
包含一个指针。因此我需要在复制构造函数中做一个深层复制。但是我不想在可能的情况下在函数之间传递值时这样做。
我想你的意思是区分右值和左值。您可以使用这些重载来做到这一点。
void foo(myObj& x) {
cout << "call by l-value" << endl;
}
void foo(myObj&& x) {
cout << "call by r-value" << endl;
}
这是一个demo
是否可以要求编译器尽可能使用函数的 "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
提前致谢。
编辑:
- 由于某些特殊原因
operator +
将修改输入myObj& x
因此它不接受常量。
是的,希望尽可能修改原始输入。否则它将执行 "copy" 并修改复制的值。
- 更多背景:
这个myObj
包含一个指针。因此我需要在复制构造函数中做一个深层复制。但是我不想在可能的情况下在函数之间传递值时这样做。
我想你的意思是区分右值和左值。您可以使用这些重载来做到这一点。
void foo(myObj& x) {
cout << "call by l-value" << endl;
}
void foo(myObj&& x) {
cout << "call by r-value" << endl;
}
这是一个demo