在这种情况下,我如何正确执行const_cast
How do I perform const_cast in this case correctly?
我有一个函数
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
不是常量的事实意味着它可以aWord
突变。即使它在这个版本中没有变异,将来可能会有人来改变它。然后,您的程序将以如此可怕的方式中断,以至于无法找到错误。
如果你抛弃了恒常性,那么你就做错了什么。
这里唯一的解决方案(如果您无法更改接口)是通过非成本版本。由于您没有,因此您应该创建一个:
std::string aWordTmpCopy(aWord);
Validate(letter, aWordTmpCopy);