【问题标题】:passing reference argument to value argument将引用参数传递给值参数
【发布时间】:2015-01-11 14:28:40
【问题描述】:

忽略可能在以下 C++ 代码中完成的任何编译器优化,是

void f(int n) {
    n += 1;
}

void g(int &n) {
    f(n);
}

相当于

void f(int n) {
    n += 1;
}

void g(int *n) {
    f(*n);
}

?

所以在使用引用参数时仍然可以在不那么明确可见的地方制作值副本?

编辑 我在问是否可以使用参考参数制作实际值副本。在第二种情况下使用指针时,我显式地取消引用指针以按值传递,但是使用引用参数有时会隐式地取消引用吗?是我的问题。

【问题讨论】:

  • 不等价:你不能在版本之间以同样的方式调用g
  • 以什么方式等效? g 在每个接口中都有不同的接口(例如,我可以将nullptr 传递给第二个接口(并打破它))
  • 回答您的编辑,是的,将复制n 引用的整数并按值传递给 f()

标签: c++ pointers reference


【解决方案1】:

我在问是否可以使用引用参数制作实际值副本。

当然。它是一个参考的事实是无关紧要的。您可以像对待它所引用的对象一样对待它。

在第二种情况下使用指针时,我显式取消引用指针以按值传递,但使用引用参数有时会隐式取消引用吗?

您将引用视为某种隐藏指针。术语在这里并没有真正的帮助。 “取消引用”是您对指针而不是引用所做的事情。事实上,该标准已更改为使用“执行间接”而不是“取消引用”来帮助澄清这一点。关键是,引用并没有被取消引用,因为这不是发生的事情——你只是在复制被引用的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2014-09-09
    • 2019-09-27
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多