作者ric2k1 (Ric)
看板EE_DSnP
标题Re: [问题] const_cast的问题
时间Thu Oct 14 20:28:20 2010
※ 引述《scuendless (scu)》之铭言:
: 想请问一下大家
: 在看讲义的时候不是很了解
: 为什麽const_cast<T>()在设计的时候
: 为什麽只能对pointer做转换呢?
: 如果说C++可以透过对object取址再取ref的方式来绕过去
: 那那时候设计只能对pointer转换的用意是甚麽呢?
: (就有甚麽情况我们是希望可以动const pointer但尽量不要动const object吗)
: 想不太到甚麽合理的原因耶
: 谢谢!!
"const is used for a reason"!
所以就语意上来说,其实不应该让你可以将 const cast 掉。
也就是说,如果那个 const 是你自己写 code 时加上去的,
你就不应该在其他地方想要把这个 const 去掉。
那我们什麽时候会需要用到 const_cast 呢?
应该是你拿到一些 legacy code 的 function,它的 prototype 没有宣告 const,
而你 (caller) 要传入的的 parameter 本来是 const,
如果要改的话就兹事体大 (或是根本不能改,比方说只给 lib + header files),
所以不得已,只好将 const cast 掉。
也就是说,const_cast 是用在 parameter passing 的时候,
像是:
void iAmLegacyCode(TypeName *p) { ... }
....
void myFunction() {
const TypeName *pp;
...
iAmLegacyCode(const_cast<TypeName *>(pp));
...
}
相反的,如果 parameter 是 object type,
那在传的时候本来就会做一份 copy,所以有没有 const 就没差了!
void iAmLegacyCode2(TypeName p) { ... }
....
void myFunction() {
const TypeName pp;
...
iAmLegacyCode(pp); // will do "TypeName p = pp"
...
}
另外还有一个很重要的观念是:
const_cast 不会把原来变数本身 "const" 的属性改成 non-const
也就是说,
const_cast<TypeName *>(pp) 其实是产生 pp 的一份 "TypeName *" 的 copy,
意即一个暂时(无名)的 pointer,指到与 pp 指到的相同的位置,
而这个指到的位址里的内容与属性是不会改变的。
总之 const_cast 对於 pp 指到的内容本身来说是没有影响的,
pp 在其他地方还是 const TypeName *。
但是如果我们允许 const_cast<TypeName>(pp),
那麽我们将会改变到 pp 本身的内容与属性,
执行完後 pp 本身的 const 就不见了!
大致是这样吧,我想,欢迎补充。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.193.11.13
※ 编辑: ric2k1 来自: 123.193.11.13 (10/14 21:07)