我有一些看起来像这样的代码:
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
,但我想尽可能避免这种情况。
在这种情况下,我有哪些选择?
答案 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