我们知道,在 C++ 中,我们可以使用引用所引用类型的对象/变量来初始化引用。例如,我们可以使用 int 变量来初始化对 int 的引用:
int i;
int& r=i;
但是当涉及到指针的引用时,情况就会变得困惑。假设我需要定义对指针的引用:
int* & r
为了初始化它,我们需要为r
分配一个指向int的指针。以下代码有效(继续上面的代码):
int* p = &i;
int* & r = p;
但是下面的代码会导致编译错误,即使 = 的右侧确实是一个指向 int 的指针:
int* & r = &i;
错误信息是:
为什么?为什么编译器可以从'initializing': cannot convert from 'int *' to 'int *&'.
int
转换为int&
,但不能从int *
转换为int *&
?为什么我可以用p
初始化,但不能用&i
初始化?它们不是一样的吗?
PS:我在 Windows 上使用 Visual Studio 2015。
最佳答案
让我们使用另一个编译器,看看它是否更有意义:
error: cannot bind non-const lvalue reference of type 'int*&' to an rvalue of type 'int*'
此诊断更好地解释了问题。 int* &
是左值引用类型。 &i
是右值表达式。正如错误所解释的,非常量左值不能绑定(bind)到右值表达式。
Aren't [
p
and&i
] the same?
它们不一样。 p
是一个 id 表达式。变量的 ID 表达式是左值。
&p
表达式是一元 &
运算符。运算符的结果是纯右值。
关于c++ - 关于初始化引用指针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54661647/