我想将指向const的对象放入一个容纳非const指针的容器中。我有什么选择?

时间:2017-01-12 02:22:12

标签: c++ const

我有一些看起来像这样的代码:

void addPtrs(vector<Thing*> & ThingPtrs, const vector<Thing> & actualThings) {
       for (const Thing & t : actualThings)
           if (/*some condition*/)
               ThingPtrs.push_back(&t);
}

基本上,我想通过指向具有某些条件的ThingPtrs指针来修改Thing。但是,因为我不想修改实际的Thing,所以我将actualThings标记为const,现在我无法将const指针指定给非const 1}}指针。

显然,一个解决方案就是不做actualThings const,但我实际上并不想修改它。另一个解决方案是使用const_cast,但我想尽可能避免这种情况。

在这种情况下,我有哪些选择?

1 个答案:

答案 0 :(得分:2)

按照设计,const std::vector不允许您直接修改它的元素。由于actualThings是常量,因此您无法修改其内容。任何引用或指向它的元素都将是const。

您在不更改功能原型的情况下找到的任何解决方案最终都会涉及将const Thing &const Thing *转换为非const等效的解决方案,无论您如何着装。任何指针强制转换或重新解释都只是围绕const_cast

如果您担心addPtrs没有修改actualThings(在称之为非const成员的意义上),您可以更改您的界面以接受开始/结束对迭代器。允许您的函数编译的其他更改包括从actualThings删除const以获取vector<Thing> & actualThings或将const添加到ThingPtrs中的元素类型以获取vector<const Thing*> & ThingPtrs