如果要执行const_cast,为什么要制作参数常量?



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

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

如果你要把它扔掉,那么ptr成为指向const的指针有什么意义呢? ptr 没有在函数中的任何地方使用,只是temp,所以让它成为指向 non-const 的指针,以便人们知道对象可能会被修改不是更好吗?

有没有理由使参数const然后const_cast"将其"在体内",而不仅仅是使其非常量?

如果你要把它扔掉,那么ptr成为const的指针有什么意义呢?

没有。

它破坏了函数契约,是某人迷失在代码设计中的一个例子。

<小时 />

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

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

糟糕的设计。如果代码从未被使用过,那么这只是简单的不良做法,你应该从规范中解雇做这件事的程序员。

它发生的一个实例(以及为什么首先会有const_cast)是,如果你有一个没有定义 const 的遗留第三方库(尤其是 c 库)(或者将您的 const 正确代码与某人的 const 正确代码接口)。恕我直言,留下该参考仍然是一个可怕的设计。

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

在代码中使用它很糟糕,并且很可能导致未定义的行为,尤其是在严格的混叠规则周围。

编辑:我应该指定,只有当你真的知道你在做什么时,你才能而且应该这样做。你永远无法让legacy不惹temp的保证人.如果您可以访问代码,最好将其重构为常量正确,而不是这样做,(这就是为什么有些人不喜欢const因为它具有传染性,但我认为这是它的功能之一!

最新更新