我有一个功能
static bool Validate(const char& letter, string& aWord)
我需要调用它
Validate(letter, aWord); // where aWord is const
在这种情况下,const_cast的正确方法是什么?
答案 0 :(得分:4)
如果您完全确定该函数不会修改字符串,则可以执行以下操作:
Validate (letter, const_cast<std::string &>(aWord));
然而,更安全的做法是,如果签名可以假设更改为const
,那么这是一个不必要的副本,就是复制字符串并传递副本。
std::string copyOfAWord = aWord;
Validate (letter, copyOfAWord);
如果确实改变了某些内容,那么你的副本就会有结果,但它会破坏你的逻辑。
答案 1 :(得分:3)
正确的方法是 NOT 来投射它。
这里的签名
static bool Validate(const char& letter, string& aWord)
表示Validate()
可能会更改参数aWord
。因此传递一个将被突变的const值是未定义的行为(如果它被突变(参见最后一段))。
如果您确定 Validate()
不会改变aWord
,那么仍然不会抛弃constness。在这种情况下,请更改其签名以反映所提供的保证。
aWord
不是const的事实意味着它可以改变aWord
。即使它在这个版本中没有变异,未来的某个人也可能会改变它。那么你的程序将以如此可怕的方式打破,以至于找不到错误是不可能的。
如果你要抛弃constness,那么你做错了。
这里唯一的解决方案(如果可以;更改界面)是通过非成本版本。既然你没有,你应该创建一个:
std::string aWordTmpCopy(aWord);
Validate(letter, aWordTmpCopy);