尝试修改常量引用
Try to modify const reference
我和同事发生了争执。有一次我确实试图修改常量引用。
代码示例如下:
#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
我认为它是这样工作的:
我创建了一个常量指针变量a,该变量的值为"0"(零)。它是局部变量,在堆栈中占据4个字节的内存。
然后我创建了一个指向指针变量的指针,我去掉了不断的修改,取了变量的地址
我认为这段代码运行良好,不会导致错误。但我需要一些解释。我说得对吗?
const int *a
和int * 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
的内容。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 为什么我可以通过引用修改常量返回
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 将常量指针引用绑定到非常量指针
- 通过常量引用传递参数的矩阵模板类
- 按值捕获引用时出现非常量
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么按值传递QStringView比引用常量更快?
- 通过引用常量函数调用另一个类的非常量函数
- 构造常量对象与引用常量对象
- 引用“常量value_type”时出错
- 为什么可以在 for 语句中重新分配引用常量
- 程序反馈:命名循环索引和引用常量数据
- 堆还是栈?在c++中函数调用中引用常量字符串时
- 为什么常量结构数组在按名称引用常量结构时不放在 .rodata 中?
- 为什么编译器允许在函数中发送对迭代器的引用,该函数引用常量迭代器