尝试修改 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 *a
和 int * 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<>
以及在示例代码中使用时可能导致的未定义行为,那将是一个完美的答案,无论如何+1以上是关于尝试修改 const 引用的主要内容,如果未能解决你的问题,请参考以下文章
在修改/允许修改引用值而不触及字段本身的方法上使用或不使用 const
在 C++ 11 中将非 const 左值引用绑定到右值是不是有效?(修改)
C/C++指针踩坑历险记-常量指针-const ptr *,指针常量ptr * const,引用,指针传参,指针修改,指针指向的值修改等问题