作者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)