有一个链表示例,有人试图附加一个节点。这是代码的一部分:
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
因为它具有传染性,但我认为这是它的功能之一!