是否可以为引用变量创建引用(别名本身的别名)?
如果是,它的应用是什么?
在 C++98 中,形成对引用类型的引用是非法的。在 C++11 中,有新的引用折叠规则,简而言之,对引用的引用仍然只是一个引用(但在左值和右值引用方面存在细微差别)。考虑这段代码:
typedef int & ir;
int a;
ir & b = a;
在 C++98 中,最后一行是非法的,因为ir &
它不是有效类型(试图引用一个引用)。在 C++11 中,引用崩溃并且ir &
与int &
.
请记住,引用是不可变的,一旦初始化,您将永远无法更改引用的目标。在上面的代码中,b
将始终是 的别名a
,并且永远不能更改为其他东西的别名。因此,不需要双重间接,因为它不会让您做任何比普通引用已经可以做的事情更多的事情。
为了完整起见,参考折叠规则如下。假设T
不是引用类型。然后在概念上我们有:
(T&)& == T& (T&)&& == T& (T&&)& == T& (T&&)&& == T&&
您不能创建对引用的引用,并且 C++ 没有引用引用类型。
如果你使用一个引用来初始化另一个引用,例如:
int i = 1;
int &a = i;
int &b = a;
那么你实际所做的就是绑定to的a
引用b
。a
是同一个对象的名称,它i
是一个名称,因此int &b = a;
具有与 完全相同的效果int &b = i;
。所以你有两个对同一个对象的引用,i
.
我不能立即想到在同一个函数中有两个引用的原因,但是如果你有一个f
接受引用参数的函数,你通常会创建多个引用,并将它传递给另一个g
也接受引用参数的函数. 然后f
和g
每个都有对同一个对象的引用。
在 Python 中,像这样:
a = 1
b = a
经过此处理后,“a”和“b”的 id 相同。