c++ - 为什么 const_cast 删除指针的 constness 而不是指向 const 的指针?
问题描述
我知道这const_cast
适用于指针和引用。
我假设输入const_cast
应该是指针或引用。我想知道如果输入是对 a 的指针/引用,为什么它不会删除常量const int
?
以下代码按预期工作。
const_cast
多级指针int main() { using std::cout; #define endl '\n' const int * ip = new int(123); const int * ptr = ip; *const_cast<int*>(ptr) = 321; cout << "*ip: " << *ip << endl; // value of *ip is changed to 321 }
但是当我尝试指向
const int
或引用的指针时const int
,该值似乎没有改变。const_cast
参考 const intint main() { using std::cout; #define endl '\n' const int i = 123; const int & ri = i; const_cast<int&>(ri) = 321; cout << "i: " << i << endl; // value in 'i' is 123 }
const_cast
带有指向 const int 的指针int main() { using std::cout; #define endl '\n' const int i = 123; const int * ri = &i; *const_cast<int*>(ri) = 321; cout << "i: " << i << endl; // value in 'i' is 123 }
(1)按预期工作,但我无法理解为什么(2)和(3)不按我认为的方式工作,尽管输入const_cast
是指针/引用。
请帮助我理解这背后的哲学。谢谢。
解决方案
有两种常量。
对象的常数是对象的固有属性。它不能改变。
想想印刷书中的一页。可以看成一串字符,不能更改。它说的是它所说的,就是这样。所以它是一个const string
.
现在想想黑板。上面可能写了一些东西。你可以把它擦掉,然后写点别的。所以黑板是一个非常量string
。
另一种常量是指针和引用常量。这种常量性不是指向对象的固有属性,而是一种权限。它说你不能通过这个指针修改对象。它没有说明对象本身是否可以修改。
所以如果你有一个 const 指针,你不一定知道它真正指向什么。也许它是一个书页。也许它是一块黑板。指针不告诉。
现在,如果您确实知道它确实是一块黑板,您可能会很讨厌并要求允许继续更改上面写的内容。这就是 const_cast 所做的。它允许你做某事。
如果您要求修改字符串的权限,结果是打印的页面,会发生什么?你得到你的许可,你继续擦拭它......并且......究竟发生了什么是undefined。也许什么都没有。也许打印被弄脏了,您既不能识别原始字符串,也不能在上面写任何东西。也许你的世界会爆炸成碎片。你可以试试看,但不能保证明天也会发生同样的事情。
推荐阅读
- javascript - 异步命令未运行
- json - 在经典 asp 中将 json 数据发布到 SendGrid API v3 时,使用新行发布 textarea 标记数据失败
- javascript - TypeError:无法读取未定义 Discord.js 的属性“day”
- reactjs - 反应懒惰不工作并且在控制台中没有显示任何错误
- audio - 使用 FFMPEG:如何通过音频进行场景变化检测
- c# - 如何彻底删除 PictureBox(+ 释放内存)
- python - Delete dictionary in embedded list of dictionaries based on index number?
- python - Python HTTPServer: How to convert the extracted post data to python dictionary
- docker - Dockerize vue project
- reactjs - How to properly ask child components to do something in React Hooks