const指向不符合预期的指针

时间:2016-05-20 21:32:47

标签: c++ pointers visual-c++

运行此操作时为什么会出错?我期待ptr_ref无法修改ptr指向的地址,但事情似乎没有按计划进行。

int b = 3;
int* ptr = &b;
//says something about cannot convert int* to type const int*&
const int*& ptr_ref = ptr; 

提前致谢, 15岁的C ++ noob

3 个答案:

答案 0 :(得分:10)

声明

ptr_ref不是const指向int的引用,而是对指向const int的引用,因此您的类型不匹配。你必须这样做

int* const& ptr_ref = ptr;

答案 1 :(得分:3)

问题是类型不匹配,因此您无法创建引用。

int b = 3;
int* ptr = &b;
int*& ptr_ref = ptr;

合法。

int b = 3;
const int* ptr = &b;
const int*& ptr_ref = ptr;

合法。

int b = 3;
int* ptr = &b;
const int*& ptr_ref = ptr; 

是不匹配。

G ++的错误信息可能对您有所帮助:

error: invalid initialization of non-const reference of type 'const int*&' from an rvalue of type 'const int*'
  const int*& ptr_ref = ptr;
                        ^

本质上意味着,它必须为此表达式创建一个const int*,这是一个rvalue(本质上是一个临时对象),因此你不能保持对它的引用它。一个更简单的方法是,你不能做你写的东西,原因同样是非法的:

int& added = 3 + 2;

根据您的具体情况,您可以通过删除参考标记来解决此问题。大多数编译器会在有或没有它的情况下输出相同的汇编,至少在优化时,由于它们能够找出变量名只是别名这一事实。

甚至有些情况references can perform worse,根据你的意图,可能值得知道 - 当我发现时,我很惊讶地知道它。

答案 2 :(得分:-3)

引用本质上是const,因此将它定义为int *& const ptr_ref = ptr没有任何意义 当你谈到const引用时,它通常意味着对const的引用,这是你在问题中使用的定义。

[编辑]编辑我的答案,因为我错误地将const放在&符号的错误一边--C ++不会原谅你[/ edit]