2012-06-03 73 views
0

我有一個函數如何在這種情況下正確執行const_cast?

static bool Validate(const char& letter, string& aWord) 

我需要調用它

Validate(letter, aWord); // where aWord is const 

什麼是在這種情況下的const_cast正確的方法是什麼?

+2

正確的方法是** NOT **來施放它。這裏的簽名是說Validate()可能會改變參數'aWord'。因此,傳遞一個將被突變的const值是未定義的行爲。正確的解決方案是更改驗證,以便將'aWord'作爲一個常量。 –

回答

4

如果你是絕對肯定的函數不修改字符串,你可以這樣做:

Validate (letter, const_cast<std::string &>(aWord)); 

然而,一個更安全的事情,儘管它不必要的副本,如果簽名可以假設性地改變到const,將複製字符串並傳遞副本。

std::string copyOfAWord = aWord; 
Validate (letter, copyOfAWord); 

如果它確實改變一些東西,您的副本將有結果,而不是,但它會破壞你的邏輯擺在首位。

+0

+1對於避免邪惡鑄造的建議 – Lalaland

+0

獲取錯誤:const_cast必須包含指向成員的對象的指針,引用或指針。 – unj2

+0

@ kunj2aan,哎呀,對不起。演員失蹤了&符。 – chris

3

正確的方法是不是來施放它。

這裏

static bool Validate(const char& letter, string& aWord) 

的簽名說,Validate()可能改變參數aWord。因此,傳遞一個將被突變的const值是未定義的行爲(如果它被突變了(見最後一段))。

如果肯定Validate()不發生變異aWord然後仍然不拋棄常量性。在這種情況下,請更改其簽名以反映所提供的擔保。

aWord不是const的事實表示它可能發生變異aWord。即使這個版本沒有變異,未來有人可能會出現並改變它。那麼你的程序將以這樣一種可怕的方式破壞,以至於找到錯誤將是不可能的。

如果你拋棄了常量,那麼你做錯了什麼。

這裏唯一的解決方案(如果你可以;改變接口)是通過一個非成本版本。既然你沒有,你應該創建一個:

std::string aWordTmpCopy(aWord); 
Validate(letter, aWordTmpCopy); 
+0

+1非常重視不這樣做的原因。 – chris