尝试修改常量引用

Try to modify const reference

本文关键字:引用 常量 修改      更新时间:2023-10-16

我和同事发生了争执。有一次我确实试图修改常量引用。

代码示例如下:

#include <cstdio>
#include <cstdlib>
using namespace std;
int main(int argc, char const *argv[])
{
   const int* A = NULL;
   printf("A = %pn", A);
   int** pA = const_cast<int**>(&A);
   *pA = new int(5);
   if (pA != NULL)
      printf("pA = %p, value = %dn", pA, *pA);
   else
      printf("pA null pointern");
   if (A != NULL)
      printf("A = %p, value = %dn", A, *A);
   else
      printf("A null pointern");
   return 0;
}

一切正常,日志为

 A = 00000000
 pA = 0028FED8, value = 4068760
 A = 003E1598, value = 5

我认为它是这样工作的:

  1. 我创建了一个常量指针变量a,该变量的值为"0"(零)。它是局部变量,在堆栈中占据4个字节的内存。

  2. 然后我创建了一个指向指针变量的指针,我去掉了不断的修改,取了变量的地址

我认为这段代码运行良好,不会导致错误。但我需要一些解释。我说得对吗?

const int *aint * const a不同。

案例1

[const用于*a]

这里a是常数。a指向的地址可以更改。

const int *a = malloc(sizeof (int));
if (a)
{
  //*a = 10;                    //not allowed
  a = malloc(sizeof (int));;   //allowed
}

案例2

[const用于a]

这里a地址是常数。a的值可以更改。

int * const a = malloc(sizeof (int));
if (a)
{
  *a = 10;                      //allowed
  //a = malloc(sizeof (int));;    //not allowed
}

编辑

根据@lifeOfPI的建议,阅读有关使用const_cast的内容。