2012-06-19 21 views

回答

11

A const_cast傳達有關C劇組演員不能演出的意圖的具體信息。

如果您不小心嘗試將const_cast用於除添加或刪除constvolatile以外的其他目的,編譯器將幫助您處理錯誤消息。

此外,const_cast是可搜索的,不像C風格的演員。

+0

+1用於使用該詞的意圖。 – Laserallan

2

用C++進行C風格轉換會嘗試進行靜態轉換,重新解釋轉換,常量轉換或其組合。

建議可以避免C蒙上主要是因爲...

  • 重新詮釋鑄件和const鑄件均採用罕不夠,它的好,強調你在做什麼,在其他情況下
  • ,當你需要一個靜態轉換,與C轉換相比,它明確地給你提供了額外的編譯時檢查。
+0

'C'演員陣容比其他組合更強大。有一些角落案例,其中唯一的選擇是C風格演員(例如上傳到私人基地),儘管可以認爲你不應該編寫代碼...... –

+0

@DavidRodríguez-dribeas,這很有趣,但我不能重現這一點; http://ideone.com/38Nyb – Kos

+0

@Kos:雖然不能保證,但reinterpret_cast通常只能用於單一繼承。對於多重繼承,它通常會爲一個基礎工作,但對所有其他基礎都是失敗的(基礎類中只有*一個可以駐留在派生對象的開始處)。 –

4

A const_cast只能添加或刪除const -ness(或volatile -ness,儘管這種情況不常見)。

除了dynamic_cast之外,C風格的演員陣容可以和任何「新」演員陣容完全相同(並且它可以完成一些他們都不能做的事情,儘管這裏沒有真正的關聯)。

+0

+1,單一的答案提'volatile' –

+0

@DavidRodríguez-dribeas:過分地迂腐幾乎總是好了贊成票或兩個(雖然有時只能從其他人誰也同樣迂腐... :-) –

0

const_cast更受限制,除了改變常量外,不會讓你做任何事情。這使得它更安全,即減少事故傾向。

此外,它更容易搜索。

1

同樣的行動。 C風格的演員陣容可以拋棄const。

const_cast的原因是,它可以作爲一個可搜索的紅旗,搜索和仔細審查/懲罰有罪的東西。這個想法是,C++比C更緊密。因此,故意違反類型系統(例如違反const正確性)(如果不是不可能的話)很容易被發現。

使這種違反類型安全的行爲完全不可能會破壞太多的向後兼容性。

+0

+1可搜索的部分,這是非常真實的。 – sashoalm

1

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*沒有任何問題。