对指针行为不符合预期行为的 const 引用

const reference to a pointer not behaving as expected

本文关键字:const 引用 不符合 指针      更新时间:2023-10-16

为什么我在运行这个时会出现错误?我预计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++菜鸟

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

int* const& ptr_ref = ptr;

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

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*,这是一个右值(本质上是一个临时对象),因此您无法保留对它的引用。更简单的表达方式是,你不能做你写的东西,原因与这是非法的相同:

int& added = 3 + 2;

根据您的情况,您只需删除参考名称即可解决此问题。大多数编译器将输出带有或不带有它的相同程序集,至少在优化时是这样,因为它们能够找出变量名只是一个别名的事实。

甚至在某些情况下,引用可能会表现得更糟,根据您的意图,可能值得了解 - 当我发现时,我很惊讶地知道它。

引用

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

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