关于初始化引用指针的引用的问题 我们知道C++中可以用引用引用的对象的对象变量来初始化引用。例如,我们可以使用int变量初始化对int的引用: int i; int& r=i;

关于初始化引用指针的引用的问题 我们知道C++中可以用引用引用的对象的对象变量来初始化引用。例如,我们可以使用int变量初始化对int的引用: int i; int& r=i;,c++,pointers,reference,initialization,C++,Pointers,Reference,Initialization,但当涉及到指针时,情况变得混乱。假设我需要定义对指针的引用: int* & r 要初始化它,我们需要分配r一个指向int的指针。以下代码有效(继续上面的代码): 但以下代码会导致编译错误,即使=的右侧确实是指向int的指针: int* & r = &i; 错误消息是: “正在初始化”:无法从“int*”转换为“int*&” 为什么??为什么编译器可以从int转换为int&,但不能从int*转换为int*&?为什么我可以用p初始化,但不能用&I初始化?他们不一样吗 PS

但当涉及到指针时,情况变得混乱。假设我需要定义对指针的引用:

int* & r
要初始化它,我们需要分配
r
一个指向int的指针。以下代码有效(继续上面的代码):

但以下代码会导致编译错误,即使=的右侧确实是指向int的指针:

int* & r = &i;
错误消息是:

“正在初始化”:无法从“int*”转换为“int*&”

为什么??为什么编译器可以从
int
转换为
int&
,但不能从
int*
转换为
int*&
?为什么我可以用
p
初始化,但不能用
&I
初始化?他们不一样吗


PS:我正在Windows上使用Visual Studio 2015。

让我们使用另一个编译器,看看它是否更有意义:

错误:无法将“int*&”类型的非常量左值引用绑定到“int*”类型的右值

此诊断可以更好地解释问题
int*&
是一种左值引用类型
&i
是一个右值表达式。正如错误所解释的,非常量左值不能绑定到右值表达式

难道[
p
&i
]不一样吗

它们不一样
p
是一个id表达式。变量的Id表达式是左值


&p
表达式是一元
&
运算符。运算符的结果是一个prvalue。

我明白了。所以我应该写
int*&&r=&I。谢谢您的帮助。@user5280911您可以这样写。我不知道为什么应该,或者为什么我想。
int* & r = &i;