C++:从类型"int*"的表达式初始化类型"const int*&"的引用无效

c++: invalid initialization of reference of type 'const int*&' from expression of type 'int*'

本文关键字:int 类型 引用 无效 const 表达式 C++ 初始化      更新时间:2023-10-16
int *b = new int();
const int *&a = b;

IDE 显示"从类型 int* 的表达式初始化类型 const int*& 的引用无效"

我不明白。

不能绑定不同类型的引用;在这种情况下,它们是int *const int*的。

对于const int *&a = b;b是一个int*,然后首先需要转换为const int*。这里允许隐式转换,但转换后的const int*是临时的,不能绑定到a;因为它是对非常量量的左值引用。

另一方面,临时对象可以绑定到常量或右值引用的左值引用,即

const int * const &a = b; // fine, and the lifetime of the temporary is extended to match the lifetime of the reference a

注意 const 的位置,现在a被声明为对 const 指针的左值引用 const 指向 const int。

  • b指向 int 的指针
  • a 是对指向 const int 的指针的引用。

所以b不能分配给a.

您可能希望引用指向 int 的 const 指针

int *b = new int();
int *const &a = b;

正式原因是int*const int*是不同的类型,并且转换会创建一个临时引用,并且您不能将非常量引用绑定到临时引用。

使它成为对常量指针的引用将起作用:

const int * const &a = b;

对于一个激励性的例子,让我们假设这是允许的:

int* p = nullptr;
const int*& rp = p;

rpp现在引用同一对象。

让我们做一个const int.

const int y = 1;

const int*分配给const int*应该是安全的,对吧?

rp = &y;          

现在,由于*p不是常量,我们可以给它分配一个新值:

*p = 0xbaad1dea;  

但是prp是同一个对象,*rpy所以*p也是y的,yconst

现在我们处于不确定行为的领域。

问题是这两种类型

int *

const int *

是两种不同的类型。因此,右侧的表达式是变量b,将转换为类型为 const int *rvalue

不能将非常量引用绑定到rvalue。所以你必须写

const int * const &a = b;