我有一個函數如何在這種情況下正確執行const_cast?
static bool Validate(const char& letter, string& aWord)
我需要調用它
Validate(letter, aWord); // where aWord is const
什麼是在這種情況下的const_cast正確的方法是什麼?
我有一個函數如何在這種情況下正確執行const_cast?
static bool Validate(const char& letter, string& aWord)
我需要調用它
Validate(letter, aWord); // where aWord is const
什麼是在這種情況下的const_cast正確的方法是什麼?
如果你是絕對肯定的函數不修改字符串,你可以這樣做:
Validate (letter, const_cast<std::string &>(aWord));
然而,一個更安全的事情,儘管它不必要的副本,如果簽名可以假設性地改變到const
,將複製字符串並傳遞副本。
std::string copyOfAWord = aWord;
Validate (letter, copyOfAWord);
如果它確實改變一些東西,您的副本將有結果,而不是,但它會破壞你的邏輯擺在首位。
正確的方法是不是來施放它。
這裏
static bool Validate(const char& letter, string& aWord)
的簽名說,Validate()
可能改變參數aWord
。因此,傳遞一個將被突變的const值是未定義的行爲(如果它被突變了(見最後一段))。
如果肯定是Validate()
不發生變異aWord
然後仍然不拋棄常量性。在這種情況下,請更改其簽名以反映所提供的擔保。
aWord
不是const的事實表示它可能發生變異aWord
。即使這個版本沒有變異,未來有人可能會出現並改變它。那麼你的程序將以這樣一種可怕的方式破壞,以至於找到錯誤將是不可能的。
如果你拋棄了常量,那麼你做錯了什麼。
這裏唯一的解決方案(如果你可以;改變接口)是通過一個非成本版本。既然你沒有,你應該創建一個:
std::string aWordTmpCopy(aWord);
Validate(letter, aWordTmpCopy);
+1非常重視不這樣做的原因。 – chris
正確的方法是** NOT **來施放它。這裏的簽名是說Validate()可能會改變參數'aWord'。因此,傳遞一個將被突變的const值是未定義的行爲。正確的解決方案是更改驗證,以便將'aWord'作爲一個常量。 –