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

时间:2012-06-03 02:30:58

标签: c++

我有一个功能

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

我需要调用它

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

在这种情况下,const_cast的正确方法是什么?

2 个答案:

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