int *b = new int();
const int *&a = b;
IDE显示"类型为const int*&
&#34的表达式int*
类型的引用无效初始化
我不明白。
答案 0 :(得分:2)
b
是指向int 的指针。a
是对指向const int 的指针的引用。因此b
无法分配给a
。
您可能希望引用 const指针指向int :
int *b = new int();
int *const &a = b;
答案 1 :(得分:2)
您无法绑定不同类型的引用;对于这种情况,他们是int *
和const int*
。
对于const int *&a = b;
,b
是int*
,然后需要首先转换为const int*
。此处允许隐式转换,但转换后的const int*
是临时转换,无法绑定到a
;因为它是对非const的左值引用。
另一方面,temporary object可以绑定到对const或rvalue-reference的左值引用,即
。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 int的const指针的左值引用。
答案 2 :(得分:1)
正式的原因是int*
和const int*
是不同的类型,转换会创建一个临时的,并且您不能将非const引用绑定到临时。
使它成为const指针的引用将起作用:
const int * const &a = b;
对于一个激励性的例子,让我们假设这是允许的:
int* p = nullptr;
const int*& rp = p;
rp
和p
现在引用相同的对象。
让我们做一个const int
。
const int y = 1;
将const int*
分配给const int*
应该是安全的,对吗?
rp = &y;
现在,由于*p
不是const,我们可以为它分配一个新值:
*p = 0xbaad1dea;
但p
与rp
的对象相同,*rp
为y
,因此*p
也是y
,{{1}是} y
现在我们处于未定义行为的土地上。
答案 3 :(得分:0)
问题是这两种类型
int *
和
const int *
是两种不同的类型。因此,右侧的变量b
中的表达式将转换为rvalue
类型的const int *
。
您不能将非常量引用绑定到rvalue
。所以你必须写
const int * const &a = b;