通过参考传递参考?

时间:2014-10-05 23:01:57

标签: c++ reference

请考虑以下代码:

void func(Thing& thing) {
    ...
}

int main() {
    Thing t;
    Thing& ref = t;
    func(ref);
}

我通过引用传递了一个引用。

这完全等同于以下代码吗?

void func(Thing& thing) {
    ...
}

int main() {
    Thing t;
    func(t);
}

如果没有,结果有何不同?

2 个答案:

答案 0 :(得分:1)

Thing t;
Thing& ref = t;
func(ref);

Thing t;
Thing ref = t; // ref is not a reference to t, but a copy of t
func(ref);

不同之处在于,在第一种情况下传递原始对象t,在第二种情况下传递它的副本。


编辑问题后,两种情况都表现相同。

Thing t;
Thing& ref = t;
func(ref);

Thing t;
func(t);

答案 1 :(得分:1)

这似乎更像是“什么是参考”问题。

您可以根据对象以及识别这些对象的表达式来理解引用。在这种情况下:

Thing t;
Thing ref = t;

我们有两个不同的对象。其中一个名称为t,另一个称为ref

在案件中:

Thing t;
Thing &ref = t;

有一个对象;它有两个标识符tref。该代码与完全相同

Thing ref;
Thing &t = ref;

每当您在表达式中使用thingref时,都应理解为识别该单个对象。

调用func绑定对提供的对象的引用。在第二种情况下,func(ref)func(t)之间没有区别,它们都传递相同的对象。当我们在func内时,仍然有一个对象,它有三个名称:

main::ref       // not currently visible
main::t         // not currently visible
func::thing     // visible

(注意:::的这种用法不是有效的C ++语法,希望很明显我的意思)。可见性适用于标识符,而不适用于对象。