【发布时间】:2020-08-01 08:32:14
【问题描述】:
是否可以要求编译器在可能的情况下使用函数的“引用调用”版本?我希望尽可能避免“复制”
例如,我有一个函数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,因此它不接受常量。
是的,希望尽可能修改原始输入。否则它会做一个“复制”并修改复制的值。
- 更多背景:
这个myObj 包含一个指针。因此我需要在复制构造函数中进行深度复制。但我不想在可能的函数之间传递值时这样做。
【问题讨论】:
-
仅供参考,
operator +应该返回一个新对象,而不是引用。 -
也应该采用 const 引用。
-
“我希望尽可能避免“复制”” - 请记住,按值传递通常会启用 move。
-
我有点好奇您是如何设法以不触发未定义行为的方式实现
myObj& operator + (myObj& obj)。你返回什么? -
按值传递有什么问题?您编写了函数来获取一个值——没有什么强迫您实现该函数。在 C++ 中,你得到你所支付的,并且你支付了一个函数,该函数按值获取
myObj。
标签: c++ pass-by-reference pass-by-value