const
这些天我对关键词非常恼火,因为我对它并不熟悉.我有一个存储所有const指针的向量vector<const BoxT<T> *> *Q_exclude
,并且在另一个类的构造函数中,我需要将此队列中的一个元素作为参数传入并将其分配给非const成员.我的问题是:
如何将const变量分配给非const变量?我知道这没有意义,因为毕竟const是一个const,不应该被改变.但是在这个过程中必须改变那个恼人的成员变量REALLY!我也可能会将向量中的数据类型更改为非const,但这样做太多了.或者有谁知道如何避免这种情况?
Lig*_*ica 86
您可以将const
对象分配给非const
对象就好了.因为您正在复制并因此创建新对象,const
所以不会违反任何内容.
int main() {
const int a = 3;
int b = a;
}
Run Code Online (Sandbox Code Playgroud)
如果要获取指向原始对象的指针或引用,则会有所不同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'
Run Code Online (Sandbox Code Playgroud)
const_cast
如果你真的必须,你可以用来破解类型安全,但回想一下你正是这样做的:摆脱类型安全.它仍然不确定的修改a
通过b
在下面的例子:
int main() {
const int a = 3;
int& b = const_cast<int&>(a);
b = 3;
}
Run Code Online (Sandbox Code Playgroud)
虽然编译没有错误,但任何事情都可能发生,包括打开黑洞或将所有辛苦赚来的积蓄转入我的银行账户.
如果你已经达到了你认为要求这样做的目的,我会紧急重新审视你的设计,因为它有些问题.
更改常量类型将导致未定义的行为.
但是,如果你有一个原始的非const对象,它由指向const的指针指向或由引用指向const引用,那么你可以使用const_cast来消除该const-ness.
虚掷常量性被认为是邪恶的,应该不会避免.如果要通过它修改数据,则应考虑将在vector中使用的指针类型更改为非const.
丢弃指针的常量性的实际代码为:
BoxT<T> * nonConstObj = const_cast<BoxT<T> *>(constObj);
Run Code Online (Sandbox Code Playgroud)
但是请注意,这确实是在作弊。更好的解决方案是弄清楚为什么要修改const对象,然后重新设计代码,这样就不必...。或者从向量中删除const声明(如果事实证明您不这样做)毕竟,我真的希望这些项目是只读的。