我经常听到这种说法,但我并不能找到const_cast为什么被认为是有害的原因。
在以下示例中:
template <typename T>
void OscillatorToFieldTransformer<T>::setOscillator(const SysOscillatorBase<T> &src)
{
oscillatorSrc = const_cast<SysOscillatorBase<T>*>(&src);
}
我正在使用一个引用,通过使用const修饰符,我保护了我的引用不被更改。另一方面,如果我不使用const_cast,代码将无法编译。为什么在这里使用const_cast是有害的?
对于下面的例子同样适用:
template <typename T>
void SysSystemBase<T>::addOscillator(const SysOscillatorBase<T> &src)
{
bool alreadyThere = 0;
for(unsigned long i = 0; i < oscillators.size(); i++)
{
if(&src == oscillators[i])
{
alreadyThere = 1;
break;
}
}
if(!alreadyThere)
{
oscillators.push_back(const_cast<SysOscillatorBase<T>*>(&src));
}
}
请提供一些例子,让我看到使用const_cast是一个不好的想法/不专业的行为。
感谢您的任何努力 :)
const
的整个目的是防止您修改某些内容,这就是为什么您的代码会产生错误。添加const_cast
基本上是告诉编译器闭嘴,你知道自己在做什么。这就是为什么这不是一个好主意。如果您不希望它是const
,则不要声明它为const
。 - Cody Grayconst SysOscillatorBase<T> &
。相反,它们应该使用SysOscillatorBase<T> &
。由于oscillatorSrc
不是const
,程序员告诉编译器(和全世界)它保留了干涉oscillatorSrc
内部的权利。如果你没有改变oscillatorSrc
,那么它也应该是const
,你的问题就解决了。向量也是一样的。 - Mike DeSimone