Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;:类型为';的引用初始化无效;常数整数*&';来自类型为'的表达式;int*';_C++_Pointers_Reference_Initialization - Fatal编程技术网

C++ c++;:类型为';的引用初始化无效;常数整数*&';来自类型为'的表达式;int*';

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

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*
是临时的,不能绑定到
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;