c ++:类型' const int *&'的引用无效初始化来自类型' int *'

时间:2017-01-26 13:39:13

标签: c++ pointers reference initialization

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

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

我不明白。

4 个答案:

答案 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;bint*,然后需要首先转换为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;

rpp现在引用相同的对象。

让我们做一个const int

const int y = 1;

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

rp = &y;          

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

*p = 0xbaad1dea;  

prp的对象相同,*rpy,因此*p也是y,{{1}是} y

现在我们处于未定义行为的土地上。

答案 3 :(得分:0)

问题是这两种类型

int *

const int *

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

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

const int * const &a = b;