请考虑以下代码:
void func(Thing& thing) {
...
}
int main() {
Thing t;
Thing& ref = t;
func(ref);
}
我通过引用传递了一个引用。
这完全等同于以下代码吗?
void func(Thing& thing) {
...
}
int main() {
Thing t;
func(t);
}
如果没有,结果有何不同?
答案 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;
有一个对象;它有两个标识符t
和ref
。该代码与完全相同:
Thing ref;
Thing &t = ref;
每当您在表达式中使用thing
或ref
时,都应理解为识别该单个对象。
调用func
绑定对提供的对象的引用。在第二种情况下,func(ref)
和func(t)
之间没有区别,它们都传递相同的对象。当我们在func
内时,仍然有一个对象,它有三个名称:
main::ref // not currently visible
main::t // not currently visible
func::thing // visible
(注意:::
的这种用法不是有效的C ++语法,希望很明显我的意思)。可见性适用于标识符,而不适用于对象。