新手问题:c ++ const到非const转换

Sha*_*ang 45 c++ const

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)

虽然编译没有错误,但任何事情都可能发生,包括打开黑洞或将所有辛苦赚来的积蓄转入我的银行账户.

如果你已经达到了你认为要求这样做的目的,我会紧急重新审视你的设计,因为它有些问题.

  • +1表示可以发生任何事情,包括打开一个黑洞或将所有辛苦赚来的积蓄转入我的银行账户_.一如既往的优秀答案! (7认同)
  • @Destructor:应该注意的是,尽管UB代码堆栈溢出普遍存在,但我的银行帐户中还没有出现任何来之不易的节省.:( (5认同)
  • 我见过的最清晰的评论.你已经两次救了我的命 (3认同)
  • 现在我记下你的完整评论。哈哈 (2认同)

Alo*_*ave 8

更改常量类型将导致未定义的行为.

但是,如果你有一个原始的非const对象,它由指向const的指针指向或由引用指向const引用,那么你可以使用const_cast来消除该const-ness.

虚掷常量性被认为是邪恶的,应该不会避免.如果要通过它修改数据,则应考虑将在vector中使用的指针类型更改为非const.

  • "被认为是邪恶的,不应该被避免" - 那你是斯莱特林吗? (18认同)

Jer*_*ner 5

丢弃指针的常量性的实际代码为:

BoxT<T> * nonConstObj = const_cast<BoxT<T> *>(constObj);
Run Code Online (Sandbox Code Playgroud)

但是请注意,这确实是在作弊。更好的解决方案是弄清楚为什么要修改const对象,然后重新设计代码,这样就不必...。或者从向量中删除const声明(如果事实证明您不这样做)毕竟,我真的希望这些项目是只读的。