【问题标题】:Is it possible to do "call by reference when possible" in C++?是否可以在 C++ 中“尽可能通过引用调用”?
【发布时间】: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

提前致谢。

编辑:

  1. 出于某种特殊原因,operator + 将修改输入 myObj&amp; x,因此它不接受常量。

是的,希望尽可能修改原始输入。否则它会做一个“复制”并修改复制的值。

  1. 更多背景:

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

【问题讨论】:

  • 仅供参考,operator + 应该返回一个新对象,而不是引用。
  • 也应该采用 const 引用。
  • “我希望尽可能避免“复制”” - 请记住,按值传递通常会启用 move
  • 我有点好奇您是如何设法以不触发未定义行为的方式实现myObj&amp; operator + (myObj&amp; obj)。你返回什么?
  • 按值传递有什么问题?您编写了函数来获取一个值——没有什么强迫您实现该函数。在 C++ 中,你得到你所支付的,并且你支付了一个函数,该函数按值获取 myObj

标签: c++ pass-by-reference pass-by-value


【解决方案1】:

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

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

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

这是demo

【讨论】:

  • 是的,我正在尝试找到一种方法来区分 r 值和 l 值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2016-01-23
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
相关资源
最近更新 更多