c++ - 关于初始化引用指针的问题

标签 c++ pointers reference initialization

我们知道,在 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/

相关文章:

c++ - 为什么我不能为指向 null 的指针设置数据值

Java:将内容从一个变量移动到另一个变量

c++ - 为什么 std::string 引用不能带 char*?

c++ - 没有逻辑运算符的舍入整数除法

c++ - 使用 Boost 图库的 adjacency_matrix

c++ - 在C++中的赋值运算符重载方法中删除旧的动态分配内存

C具有不同指针的相同地址?

c++ - 为什么即使在调试版本中,VS 和 Windbg 也会将 "this"指针打印为 "0xcccccccc"?

c++ - 将方法作为回调从一个类传递到另一个类

c# - 如何通过 *.csproject 文件查找引用路径