const_cast
这些天我真的很讨厌const
关键字,因为我不太熟悉它。我有一个向量,它存储所有像vector<const BoxT<T> *> *Q_exclude
这样的const指针,并且在另一个类的构造函数中,我需要将此队列中的一个元素作为参数传递并将其分配给非const成员。我的问题是:
如何将const变量分配给非const变量?我知道这没有任何意义,因为毕竟const是const,因此无论如何都不应更改。但是,在此过程中确实必须更改该烦人的成员变量!我也可能将向量中的数据类型更改为非常量,但这会花费太多精力。还是有人知道如何避免这种情况?
const
ness。int main() {
const int a = 3;
int b = a;
}
It's different,如果要获取指针或引用,则为原始const
对象:[]
int main() {
const int a = 3;
int& b = a; // or int* b = &a;
}
// error: invalid initialization of reference of type 'int&' from
// expression of type 'const int'
如果确实需要,您可以使用const_cast
来绕过类型安全性,但是请记住,您确实在这样做:摆脱类型安全性。 still
a
中通过b
修改the below example:int main() { const int a = 3; int& b = const_cast<int&>(a); b = 3; }
尽管它编译时没有错误,但是任何事情都可能发生,包括开黑洞或将所有来之不易的积蓄转入我的银行帐户。如果您已经达到了执行此操作的要求,那么我将紧急重新审查您的设计,因为它有问题。
更改常量类型将导致
未定义行为。但是,如果您有一个原始的非常量对象,该对象由指向常量的指针指向或由指向常量的引用引用,则可以使用来消除该常量。放弃常量被认为是邪恶的,应避免const_cast
not
。如果要通过向量修改数据,则应考虑将向量中使用的指针的类型更改为非常量。
丢弃指针的常数的实际代码为:BoxT<T> * nonConstObj = const_cast<BoxT<T> *>(constObj);
但是请注意,这确实是在作弊。更好的解决方案是弄清楚为什么要修改const对象,然后重新设计代码,这样就不必...。或者从向量中删除const声明(如果事实证明您不这样做)真的希望这些项目毕竟是只读的。
void SomeClass::changeASettingAndCallAFunction() const { someSetting = 0; //Can't do this someFunctionThatUsesTheSetting(); }
另一种解决方案是在对const函数使用的变量进行编辑之间调用该函数。这个想法解决了我的问题,因为我不愿意更改函数的签名,而不得不使用“ changeASettingAndCallAFunction”方法作为中介:[当您调用该函数时,您可以先在调用之前对设置进行编辑,或者(如果您不希望弄乱调用位置,则可以在需要更改该变量的情况下进行传播(如果您不喜欢调用该位置,就像我的情况一样。void SomeClass::someFunctionThatUsesTheSetting() const { //We really don't want to touch this functions implementation ClassUsesSetting* classUsesSetting = ClassUsesSetting::PropagateAcrossClass(someSetting); /* Do important stuff */ } void SomeClass::changeASettingAndCallAFunction() const { someFunctionThatUsesTheSetting(); /* Have to do this */ } void SomeClass::nonConstInvoker(){ someSetting = 0; changeASettingAndCallAFunction(); }
现在,当调用对“ someFunctionThatUsesTheSetting”的某些引用时,它将以对someSetting的更改来调用。