如果要进行const_cast,为什么要创建一个参数const?

时间:2014-11-19 17:35:29

标签: c++

有一个链表示例,其中有人试图附加节点。这是代码的一部分:

void Append(ListElement<T> const* ptr, T const& datum)
{
    ListElement<T>* temp = const_cast<ListElement<T>*>(ptr);
    // ...
}

如果您要将ptr扔掉,const指向ptr的指针有什么意义? temp并未在函数中的任何位置使用const,因此最好不要将其作为指向 -const的指针。知道对象可能被修改了吗?

是否有理由将参数const_cast然后{{1}}放在身体中而不是仅使其成为非常数?

2 个答案:

答案 0 :(得分:7)

  

如果您要将ptr丢弃,const是指向{{1}}指针的重点是什么?

无。

它打破了函数契约,是一个在代码设计中迷失方向的例子。


为了说明,它看起来像这样

  • 答:嘿,你可以从那个对象中读取,但只能阅读。
  • B:好的,给我一点,我只会读它。
  • B:在上面写

答案 1 :(得分:7)

设计不佳。如果代码从未被使用过,那么这只是一种不好的做法,你应该解雇那个用经典做过的程序员。

它发生的一个实例(以及为什么首先有一个const_cast)是,如果你有一个遗留的第三方库(特别是c库),不定义const(或接口你的const正确)代码与某人不是const正确的代码)。留下这个参考资料仍然是一个可怕的设计imho。

 int legacy(int* const_no_really_i_swear);

 int my_new_func(const int* var)
 {
     //way 1 (non-const reference goes out of scope immediately)
     legacy(const_cast<int*>(var));

     //way 2 (non-const reference goes out of scope at end of block
     {
        int* temp = const_cast<int*>(var);
        legacy(temp);
     }
 }

在代码中使用它很糟糕,很可能会导致未定义的行为,尤其是在严格的别名规则下。

编辑:如果你真的知道自己在做什么,我应该指明你可以而且应该只做这件事。你永远不能让legacytemp混在一起的保证人。如果你有权访问代码,那么最好将它重构为const,而不是这样做(这就是为什么有些人不喜欢const,因为它具有传染性,但我认为这是一个其功能!)