C++ c++;:类型为';的引用初始化无效;常数整数*&';来自类型为'的表达式;int*';
IDE显示“从C++ c++;:类型为';的引用初始化无效;常数整数*&';来自类型为'的表达式;int*';,c++,pointers,reference,initialization,C++,Pointers,Reference,Initialization,IDE显示“从int*类型的表达式初始化const int*&类型的引用无效” 我不明白。 b是指向int的指针 a是指向常量int的指针的引用 所以b不能分配给a 您可能希望引用指向int的常量指针: int *b = new int(); const int *&a = b; 不能用不同的类型绑定引用;对于这种情况,它们是int*和const int* 对于const int*&a=b,b是一个int*,然后首先需要转换为const int*。此处允许隐式转换,但转换的const
int*
类型的表达式初始化const int*&
类型的引用无效”
我不明白。
是指向int的指针b
是指向常量int的指针的引用a
b
不能分配给a
您可能希望引用指向int的常量指针:
int *b = new int();
const int *&a = b;
不能用不同的类型绑定引用;对于这种情况,它们是
int*
和const int*
对于const int*&a=b
,b
是一个int*
,然后首先需要转换为const int*
。此处允许隐式转换,但转换的const int*
是临时的,不能绑定到a
;因为它是对非常量的左值引用
另一方面,可以绑定到常量的左值引用或右值引用,即
int *b = new int();
int *const &a = b;
注意
const
的位置,现在a
被声明为指向const int的const指针的左值引用。问题在于这两种类型
const int * const &a = b; // fine, and the lifetime of the temporary is extended to match the lifetime of the reference a
及
有两种不同的类型。因此,右侧变量b
的表达式被转换为const int*
类型的rvalue
您不能将非常量引用绑定到rvalue
。所以你必须写作
const int *
形式上的原因是
int*
和const int*
是不同的类型,转换会创建一个临时引用,并且不能将非常量引用绑定到临时引用
将其作为常量指针的引用将起作用:
const int * const &a = b;
作为一个激励性的例子,让我们假设这是允许的:
const int * const &a = b;
rp
和p
现在指的是同一个对象
让我们做一个常量int
int* p = nullptr;
const int*& rp = p;
将const int*
赋值给const int*
应该是安全的,对吗
const int y = 1;
现在,由于*p
不是常量,我们可以为它指定一个新值:
rp = &y;
但是p
是与rp
相同的对象,*rp
是y
,因此*p
也是y
,而y
是const
现在我们正处在一个行为不明确的国度。原因在于指针。考虑以下内容:<代码> const int i=0;int*p;常量int*&z=&p;z=&i代码>-p
不能指向i
。但是,如果允许此转换,则可以通过指向i
的引用更改p
,并使用该引用更改i
。
rp = &y;
*p = 0xbaad1dea;