const_cast和c style cast(ObjectType)之間是否存在實際差異?常量轉換有什麼不同?
回答
A const_cast
傳達有關C劇組演員不能演出的意圖的具體信息。
如果您不小心嘗試將const_cast
用於除添加或刪除const
或volatile
以外的其他目的,編譯器將幫助您處理錯誤消息。
此外,const_cast
是可搜索的,不像C風格的演員。
用C++進行C風格轉換會嘗試進行靜態轉換,重新解釋轉換,常量轉換或其組合。
建議可以避免C蒙上主要是因爲...
- 重新詮釋鑄件和const鑄件均採用罕不夠,它的好,強調你在做什麼,在其他情況下
- ,當你需要一個靜態轉換,與C轉換相比,它明確地給你提供了額外的編譯時檢查。
'C'演員陣容比其他組合更強大。有一些角落案例,其中唯一的選擇是C風格演員(例如上傳到私人基地),儘管可以認爲你不應該編寫代碼...... –
@DavidRodríguez-dribeas,這很有趣,但我不能重現這一點; http://ideone.com/38Nyb – Kos
@Kos:雖然不能保證,但reinterpret_cast通常只能用於單一繼承。對於多重繼承,它通常會爲一個基礎工作,但對所有其他基礎都是失敗的(基礎類中只有*一個可以駐留在派生對象的開始處)。 –
A const_cast
只能添加或刪除const
-ness(或volatile
-ness,儘管這種情況不常見)。
除了dynamic_cast
之外,C風格的演員陣容可以和任何「新」演員陣容完全相同(並且它可以完成一些他們都不能做的事情,儘管這裏沒有真正的關聯)。
+1,單一的答案提'volatile' –
@DavidRodríguez-dribeas:過分地迂腐幾乎總是好了贊成票或兩個(雖然有時只能從其他人誰也同樣迂腐... :-) –
const_cast更受限制,除了改變常量外,不會讓你做任何事情。這使得它更安全,即減少事故傾向。
此外,它更容易搜索。
同樣的行動。 C風格的演員陣容可以拋棄const。
const_cast的原因是,它可以作爲一個可搜索的紅旗,搜索和仔細審查/懲罰有罪的東西。這個想法是,C++比C更緊密。因此,故意違反類型系統(例如違反const正確性)(如果不是不可能的話)很容易被發現。
使這種違反類型安全的行爲完全不可能會破壞太多的向後兼容性。
+1可搜索的部分,這是非常真實的。 – sashoalm
const_cast
只能修改常量性參數的(或揮發性的煩躁),而不是它的基本類型。所以
const T *tc = f();
volatile T *tv = g();
U *ua = const_cast<U*>(tc); //error
U *ub = const_cast<U*>(tv); //error
U *ub = (U*)(tc); //okay
U *ub = (U*)(tv); //okay
所以C樣式轉換修改CV-合格T*
到U*
沒有任何問題。
- 1. 投影轉換有什麼不同?
- 2. 編譯器在轉換整數常量時有什麼作用?
- 3. 爲什麼在Safari上轉換轉換不能正常工作?
- 4. TemplateBinding與轉換器 - 有什麼不對?
- 5. 從整數轉換爲整數有什麼不同嗎?
- 6. 爲什麼Javascript轉換時間有所不同?
- 7. fit_transform,在sklearn和get_dummies中轉換pandas有什麼不同?
- 8. 不同類型的轉換方式。有什麼區別
- 9. netmask轉換,有什麼錯?
- 10. 爲什麼我的切換不能正常轉換
- 11. 什麼處理了轉換異常?
- 12. 爲什麼Web服務轉換異常?
- 13. C:爲什麼在隱式常量轉換中溢出[-Woverflow]?
- 14. C++:非常量轉換爲常量
- 15. PHP - 什麼是常量,它們是不錯的練習,它們與變量有什麼不同?
- 16. 爲什麼不同的塊動畫常量具有相同的值?
- 17. 爲什麼從沒有指針的隱式轉換參考常量指針
- 18. 將不同列中的常量轉換爲行
- 19. 常量值不能轉換爲int
- 20. 不能從「常量jchar *」轉換爲
- 21. 張量:它是什麼,它與載體有什麼不同?
- 22. 爲什麼我必須轉換變量?
- 23. 變量===常數和常量===變量有什麼區別
- 24. 隱式從Nullable轉換爲正常,有什麼想法?
- 25. 這段代碼爲什麼沒有類型轉換異常?
- 26. C++資格轉換 - 常量
- 27. C++常量無效*轉換
- 28. 常量指針轉換
- 29. 轉換常量反應
- 30. int *常量的轉換
+1用於使用該詞的意圖。 – Laserallan