尝试修改 const 引用

Posted

技术标签:

【中文标题】尝试修改 const 引用【英文标题】:Try to modify const reference 【发布时间】:2014-09-09 11:59:14 【问题描述】:

我和我的同事发生了争执。 一旦我尝试修改常量引用。

代码示例如下:

#include <cstdio>
#include <cstdlib>

using namespace std;

int main(int argc, char const *argv[])

   const int* A = NULL;

   printf("A = %p\n", A);

   int** pA = const_cast<int**>(&A);

   *pA = new int(5);

   if (pA != NULL)
      printf("pA = %p, value = %d\n", pA, *pA);
   else
      printf("pA null pointer\n");

   if (A != NULL)
      printf("A = %p, value = %d\n", A, *A);
   else
      printf("A null pointer\n");

   return 0;

一切正常,日志是

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

我认为它是这样工作的:

    我创建了一个 const 指针变量 A,其值为“0”(零)是堆栈。它是局部变量,在堆栈中占用 4 个字节的内存。

    然后我创建一个指向指针变量的指针,我抛弃常量修改并获取变量的地址

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

【问题讨论】:

1.您创建了一个指向 const 的指针。可以修改A,而不是它指向的东西。 【参考方案1】:

const int *aint * const a 是不同的。

案例一

[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 的信息。

【讨论】:

如果它解释了const_cast&lt;&gt; 以及在示例代码中使用时可能导致的未定义行为,那将是一个完美的答案,无论如何+1

以上是关于尝试修改 const 引用的主要内容,如果未能解决你的问题,请参考以下文章

const限定符

返回 const 引用和 rvalue 引用之间的区别

在修改/允许修改引用值而不触及字段本身的方法上使用或不使用 const

在 C++ 11 中将非 const 左值引用绑定到右值是不是有效?(修改)

为啥 const 方法不能返回非常量引用?

C/C++指针踩坑历险记-常量指针-const ptr *,指针常量ptr * const,引用,指针传参,指针修改,指针指向的值修改等问题