在这种情况下,我如何正确执行const_cast

How do I perform const_cast in this case correctly?

本文关键字:执行 const cast 何正确 这种情况下      更新时间:2023-10-16

我有一个函数

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);