我明白那个const_cast
使用指针和引用。
我假设输入const_cast
应该是一个指针或引用。我想知道为什么如果输入是指针/引用,它不会消除常量性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 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
}
-
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
是一个指针/引用。
请帮助我理解这背后的哲学。谢谢。
常量有两种。
的常量object是物体的固有属性。它无法改变。
想象一下印刷书籍中的一页。它可以被视为一串字符,并且无法更改。它说的是它所说的,就是这样。所以这是一个const string
.
现在想想黑板。上面可能写着什么。你可以把它擦掉然后写点别的东西。所以黑板是非常量string
.
另一种常量是指针常量和引用常量。这种常量不是所指向对象的固有属性,而是允许。它说你不是allowed修改对象通过这个指针。它没有说明对象本身是否可以修改。
因此,如果你有一个 const 指针,你不一定知道它真正指向什么。也许这是书页。也许这是一块黑板。指针没有告诉你。
现在,如果你确实以某种方式知道它确实是一块黑板,你可以很讨厌并要求允许继续更改上面写的内容。这就是 const_cast 的作用。它允许您做某事。
如果您请求修改字符串的权限,而结果是打印页面,会发生什么情况?你得到你的许可,你继续擦拭它......然后......到底发生了什么不明确的。或许什么也没有。也许打印被弄脏了,您既无法识别原始字符串,也无法在上面写任何内容。也许你的世界会爆炸成碎片。你可以尝试看看,但不能保证明天也会发生同样的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)